阿亮的算法之路——13. 罗马数字转整数

阅读: 评论:0

阿亮的算法之路——13. 罗马数字转整数

阿亮的算法之路——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;}}
提交结果

本文发布于:2024-01-30 21:34:44,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170662168622992.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:罗马数字   之路   整数   算法
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23