leetcode从罗马数字开始

辩才天
• 阅读 1898

将罗马数字转化为十进制数字

Leetcode上的一道简单级别的题目
将罗马数字转化为对应的十进制数字,其中罗马数字的范围在1~3999

这题的关键在于了解需求,及如何将罗马数字转化为对应的十进制数字

罗马数字转化为十进制数字的规则为:

  1. 用作数字的罗马字母共有七个,即Ⅰ(1),Ⅴ(5),Ⅹ(10),L(50),C(100),D(500),M(1000).

  2. 相同的数字连写,所表示的数等于这些数相加

  3. 如果大的数字在前,小的数字在后,所表示的数等于这些数相加 如:VIII = 8,

  4. 如果小的数字在前,大的数字在后,所表示的数等于从大数减去小数。如:IX = 9

我的解答中使用了类似于链表的方法
创建两个变量current和next分别表示当前节点和下一个节点,当当前节点和下一个节点的值不同时,则将当前temp中的值根据比较结果添加至result,并赋值temp为下一个节点的值,否则将值累加至temp
为了比较方便,我在输入的string最后添加了一个‘O’其对应的值为0

/**
 * @author rale
 *
 *Given a roman numeral, convert it to an integer.
 *Input is guaranteed to be within the range from 1 to 3999.
 *
 */
public class RomanToInteger {
    public int romanToInt(String s) {
        //将两个if判断删去后测试得到的结果性能更好 可能和测试用例有关
        if(s==null || s.equals("")){
            return 0;
        }
        if(s.length()==1){
            return singleRomanToInt(s.charAt(0));
        }
        s += 'O';
        int result = 0;
        char[] romanChars = s.toCharArray();
        char current = romanChars[0];
        char next = romanChars[1];
        int temp = singleRomanToInt(current);
        for(int i = 0 ; i<romanChars.length-1 ; i++){
            current = romanChars[i];
            next = romanChars[i+1];
            int currentInt = singleRomanToInt(current);
            int nextInt = singleRomanToInt(next);
            if(currentInt==nextInt){
                temp += nextInt;
            }else if(currentInt<nextInt){
                result -= temp;
                temp = nextInt;
            }else if(currentInt>nextInt){
                result += temp;
                temp = nextInt;
            }
        }
        return result;
    }
    
    //将单个罗马字母转化为对应的数字
    private int singleRomanToInt(char s){
        int result = 0;
        switch(s){
        case 'I' : 
            result = 1;
            break;
        case 'V' :
            result = 5;
            break;
        case 'X' :
            result = 10;
            break;
        case 'L' :
            result = 50;
            break;
        case 'C' :
            result = 100;
            break;
        case 'D' :
            result = 500;
            break;
        case 'M' :
            result = 1000;
            break;
        default :
            result = 0;
            break;
        }
    return result;
    }
    
    
}
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
4年前
C++中stoi函数
作用:  将n进制的字符串转化为十进制头文件:include<string用法:1stoi(字符串,起始位置,n进制),将n进制的字符串转化为十进制23示例:4stoi(str,0,2);//将字符串str从0位置开始到末尾的2
Stella981 Stella981
4年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
Python图片转gif(将静态图转化为分块加载的动态图)
简介将静态图转化为分块加载的动态图方案1.PIL:1.创建背景图2.将原图拆分成N块并依次合成到背景图的相应位置,得到N张素材图3.将N张素材图合成GIF2.pygifsicle对合成的GIF进行优化
Wesley13 Wesley13
4年前
DecimalFormat用法
DecimalFormat是NumberFormat的一个具体子类,用于格式化十进制数字。DecimalFormat包含一个模式和一组符号符号含义:0一个数字\一个数字,不包括0 .小数的分隔符的占位符,分组分隔符的占位符;分隔格式。\缺省负数前缀。%乘以100和作为百分比显示?乘以1
Stella981 Stella981
4年前
Leetcode 11
11\.盛水的容器left,right双指针,中等偏简单难度12\.整数转罗马数字(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fleetcodecn.com%2Fproblems%2Fintegertoroman%2F)贪心算法,罗马字母含特殊
Wesley13 Wesley13
4年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ
Wesley13 Wesley13
4年前
JAVA 进制转换的几个方法
进制转化在JAVA中已经封装好了.无论是常规的10转2,8,16,还是相对应的2,8,16进制转化为10进制的方法,当然也包括10n进制,n进制转10进制的常规方法.都被封装在Integer对象中.10进制转化其他进制对应的方法,参数:n(原10进制数据),r(进制),返回值10进制转2进制Integer.toBinarySt
数据堂 数据堂
2年前
语音识别技术:从传统到现代的飞跃
一、引言语音识别技术是一种将人类语言转化为计算机可理解数据的技术。这一领域经历了从传统到现代的转变,其中最显著的是深度学习技术的引入。本文将探讨语音识别技术如何从传统迈向现代,并分析这一转变的影响。二、传统语音识别技术传统的语音识别技术主要基于规则和统计模
辩才天
辩才天
Lv1
大漠孤烟直,长河落日圆。
文章
4
粉丝
0
获赞
0