博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 13: Roman to Integer
阅读量:5216 次
发布时间:2019-06-14

本文共 3238 字,大约阅读时间需要 10 分钟。

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

关于罗马数字介绍(以下内容摘自维基百科):

罗马数字共有7个,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)。按照下述的规则可以表示任意正整数。

  • 重复数次:一个罗马数字重复几次,就表示这个数的几倍。
  • 右加左减:
    • 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
    • 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
    • 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
    • 但是,左减时不可跨越一个位值。比如,99不可以用IC(100 - 1)表示,而是用XCIX((100 - 10) + (10 -  1))表示。
    • 左减数字必须为一位,比如8写成VIII,而非IIX。
    • 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。
  • 加线乘千:
    • 在罗马数字的上方加上一条横线或者加下标的Ⅿ,表示将这个数乘以1000,即是原数的1000倍。
    • 同理,如果上方有两条横线,即是原数的1000000倍。
  • 数码限制:
    • 同一数码最多只能连续出现三次,如40不可表示为XXXX,而要表示为XL。

思路:题中数字范围为1-3999,因此不会出现加上划线的情况。利用左减数字必须为一位,即放在大数前面的小数只能有一个,因此在比较当前数字时,只需考虑其后面的一位。如果当前数字小于它后面的数字,则加上当前数字;否则就减去当前数字。

解法1:利用map接口,但时间复杂度高

 

public int romanToInt(String s){        int num = 0;        char[] chars = s.toCharArray();        Map
map = new HashMap<>(); map.put('I',1);map.put('V', 5);map.put('X', 10); map.put('L', 50);map.put('C', 100);map.put('D', 500);map.put('M', 1000); for(int i = 0; i < chars.length; i++){ if(i == chars.length - 1 || map.get(chars[i]) >= map.get(chars[i + 1])) num += map.get(chars[i]); else num -= map.get(chars[i]); } return num; }

 

解法2:

public int romanToInt(String s){        int num = 0;        int current;        char[] chars = s.toCharArray();        for(int i = 0; i < chars.length; i++){            current = charToInt(chars[i]);         //如果当前数字是最后一个数字,或当前数字大于它后面的数字,则加上当前数字            if(i == chars.length - 1 || current >= charToInt(chars[i + 1]))                num += current;         //如果当前数字小于它后面的数字,则减去当前数字            else                num -= current;        }        return num;    }    public int charToInt(char ch){        int data = 0;        switch(ch){        case 'I':             data = 1;            break;        case 'V':             data = 5;            break;        case 'X':             data = 10;            break;        case 'L':             data = 50;            break;        case 'C':             data = 100;            break;        case 'D':             data = 500;            break;        case 'M':             data = 1000;            break;        }        return data;    }

解法3:从前往后遍历字符串,每次都加上其相应的数字;如果当前数字大于它前面的数字,则减去前面数字的二倍

public int romanToInt(String s){        int num = charToInt(s.charAt(0)), cur, pre;        for(int i = 1; i < s.length(); i++){            cur = charToInt(s.charAt(i));            pre = charToInt(s.charAt(i - 1));          num += cur; //加上当前数字        //如果当前数字大于它前面的数字,则减去前面数字的二倍            if(pre < cur)                num -= 2 * pre;        }        return num;    }public int charToInt(char ch){        int data = 0;        switch(ch){        case 'I':             data = 1;            break;        case 'V':             data = 5;            break;        case 'X':             data = 10;            break;        case 'L':             data = 50;            break;        case 'C':             data = 100;            break;        case 'D':             data = 500;            break;        case 'M':             data = 1000;            break;        }        return data;    }

 

转载于:https://www.cnblogs.com/zeroingToOne/p/7806639.html

你可能感兴趣的文章
[转载] MySQL的四种事务隔离级别
查看>>
QT文件读写
查看>>
C语言小项目-火车票订票系统
查看>>
15.210控制台故障分析(解决问题的思路)
查看>>
BS调用本地应用程序的步骤
查看>>
常用到的多种锁(随时可能修改)
查看>>
用UL标签+CSS实现的柱状图
查看>>
mfc Edit控件属性
查看>>
Linq使用Join/在Razor中两次反射取属性值
查看>>
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
优秀员工一定要升职吗
查看>>
[LintCode] 462 Total Occurrence of Target
查看>>
springboot---redis缓存的使用
查看>>
架构图-模型
查看>>
sql常见面试题
查看>>
jQuery总结第一天
查看>>
Java -- Swing 组件使用
查看>>
Software--Architecture--DesignPattern IoC, Factory Method, Source Locator
查看>>
poj1936---subsequence(判断子串)
查看>>