leetcode-13. Roman to Integer
思路:首先是本弱鸡的弱鸡思路
1、将所有的组合放入Map中,key值代表罗马数字,value代表罗马数字对应的整数值
2、每次取两个值进行判断,如果匹配直接跳两个继续匹配,否则取一个进行匹配
ps:这样做的缺点就是,无法判断输入的数字是否是罗马数字,而且判断比较繁琐,
对于此题,题目中未让判断输入是否是罗马数字
class Solution { public int romanToInt(String s) { Map<String,Integer> resultMap = new HashMap<String, Integer>(); resultMap.put("I",1); resultMap.put("V",5); resultMap.put("X",10); resultMap.put("L",50); resultMap.put("C",100); resultMap.put("D",500); resultMap.put("M",1000); resultMap.put("IV",4); resultMap.put("IX",9); resultMap.put("XL",40); resultMap.put("XC",90); resultMap.put("CD",400); resultMap.put("CM",900); int len = s.length(); int result = 0; //长度为1直接匹配 if(len==1){ result += resultMap.get(s); // System.out.println(result); return result; } if(len==2){ //长度为2直接匹配 if(resultMap.containsKey(s)){ result += resultMap.get(s); // System.out.println(result); return result; }else { //两个分别匹配 result += resultMap.get(s.substring(0,1)); result += resultMap.get(s.substring(1,2)); // System.out.println(result); return result; } } String flag = ""; int strstart = 0; //用来判断最后单独判断的值的开始位置,(当倒数第二三个两个可以匹配时,最后剩下一个数需要判断,否则两个) //到这里的都是长度>=3的,然后我们循环0 --- len-2 的值(因为下边的判断有i+2,可能会造成数组越界) for(int i=0;i<len-2;i++){ flag = s.substring(i,i+2);//先判断两个的组合看是否匹配,不匹配则再尝试一个的 if(resultMap.containsKey(flag)){ result += resultMap.get(flag); i=i+1; //如果两个的匹配了,i需要+1 strstart = i+1; }else{ flag = s.substring(i,i+1); result += resultMap.get(flag); strstart = i+1; } } //取最后剩下的值进行判断 String str2end = s.substring(strstart,len); if(resultMap.containsKey(str2end)){ result += resultMap.get(str2end); // System.out.println(result); return result; }else { result += resultMap.get(str2end.substring(0,1)); result += resultMap.get(str2end.substring(1,2)); // System.out.println(result); return result; } } }
大神思路:
参考:https://www.cnblogs.com/grandyang/p/4120857.html
首先是罗马数字的规则
1、基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
2、不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
3、V 和X 左边的小数字只能用Ⅰ。
4、L 和C 左边的小数字只能用X。
5、D 和M 左边的小数字只能用C。
然后是解法:
根据规则可以分析到
1、两个数的组合AB,要加上B减去A。单个数字直接加上就可以
2、如果是两个数字的组合,则当前数字的后一个数字一定是大于当前数字的,所以当当前数字的后一个数字小于当前数字时
加上当前数字即可
3、最后一个数字因为没有后一位数字,所以单独判断。最后一位数字直接加上即可。
总结:
1、如果当前数字是最后一个数字,或者之后的数字比它小的话,则加上当前数字
2、其他情况则减去这个数字
class Solution{ public int romanToInt(String s) { int result = 0; char[] ch = s.toCharArray(); Map<String,Integer> resultMap = new HashMap<String, Integer>(); resultMap.put("I",1); resultMap.put("V",5); resultMap.put("X",10); resultMap.put("L",50); resultMap.put("C",100); resultMap.put("D",500); resultMap.put("M",1000); for(int i=0;i<ch.length-1;i++){ int ans1 = resultMap.get(ch[i]+""); int ans2 = resultMap.get(ch[i+1]+""); if(ans1>=ans2){ result += ans1; }else { result -= ans1; } } result += resultMap.get(ch[ch.length-1]+""); System.out.println(result); return result; } }