本文主要是介绍阿亮的算法之路——13. 罗马数字转整数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
第十二题的逆过程,还是比较简单的。
初次尝试
也是通过从高位开始往下匹配,匹配成功一个,就将这个数加相应的值,然后再匹配下一个字符。需要注意的是,匹配字符的时候,有的字符是两个同时匹配的,所以需要确定先匹配两个还是一个。
public static int romanToInt(String s){int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};int re = 0;int i = 0;a:while (!"".equals(s)){for (; i < romans.length; i++){if (s.length()>1){if (romans[i].equals(s.substring(0, 2))){re += nums[i];s = s.substring(2);continue a;}}if (romans[i].equals(s.substring(0,1))){re += nums[i];s = s.substring(1);continue a;}}}return re;}
有点臃肿,主要是判断边界情况。
提交结果
见怪不怪了,自己做的效率就那样
大佬思路
我用的是,判断一个或两个字符,是否和罗马数字相等,相等再将数字增加对应的大小。因为有的数字是两个字符,所以需要判断两位或者一位。
但其实,罗马这种数字的构造方法是有讲究的,一般都是前面代表的数,加上后面代表的数,只是一些特例情况,如:900、400、90、40、9、4等,是后面的数减去前面的数,只需要做一些简单的盘判断,然后决定是加还是减,最后得到结果。
代码
public int romanToInt(String s) {int sum = 0;int preNum = getValue(s.charAt(0));for(int i = 1;i < s.length(); i ++) {int num = getValue(s.charAt(i));if(preNum < num) { sum -= preNum; } else{ sum += preNum; }preNum = num;}sum += preNum;return sum;}private int getValue(char ch) {switch(ch) {case 'I': return 1;case 'V': return 5;case 'X': return 10;case 'L': return 50;case 'C': return 100;case 'D': return 500;case 'M': return 1000;default: return 0;}}
提交结果
这篇关于阿亮的算法之路——13. 罗马数字转整数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!