标签:java java leetcode 解题代码 leetcode 算法
题目:Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
翻译:把罗马转为数字
思路:如果是单纯的一个罗马字母比较好处理,但是对于4,9这样的,应该看它下一个字符代表的数字是不是比他大,要是大的话减去当前的字符代表的数字。要是小的话,则加上这个数字。
像IV ,代表4.当读到I的时候,应该判断下一个字符V和I的关系,V比I代表的数字大,所以此时应该加上V - I的值,然后指针跳过2.
代码1:
public static int romanToInt(String s) { int num = 0; String roman[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; int number[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1}; int i = 0; int len = s.length(); while(i < s.length()) { if(i<s.length()-1&&(C2N(s.charAt(i))<C2N(s.charAt(i+1))))//@ 1 { num+=C2N(s.charAt(i+1))-C2N(s.charAt(i)); i+=2; } else { num +=C2N(s.charAt(i)); i++; } } return num; } public static int C2N(char c) { switch (c) { 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: throw new NumberFormatException( "Error"); } }在@1的地方,最初写的时候两个判断条件反着写。结果报错说是越界。后来找了一会才发现。
因为在&&判断的时候,如果前面的为假,后面可以直接跳过,但是如果前面已经报错,那后面的条件也不会看直接跳错。
又是细节的问题。唉
代码2:
public int romanToInt(String s) { int num = 0; String roman[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; int number[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1}; int i = 0; while(i<=s.length()-1) { switch(s.charAt(i)) { case 'I': if(i <s.length()-1&&(s.charAt(i+1)=='V'||s.charAt(i+1)=='X')) num -=1; else num += 1; break; case 'V': num +=5; break; case 'X': if(i < s.length()-1&&(s.charAt(i+1)=='L'||s.charAt(i+1)=='C')) num -=10; else num+=10; break; case 'L': num +=50; break; case 'C': if(i < s.length()-1&&(s.charAt(i+1)=='D'||s.charAt(i+1)=='M')) num -=100; else num+=100; break; case 'D': num+=500; break; case 'M': num+=1000; break; } i++; } return num; }直接把函数整合在一起的写法。看起来不是太简介。还是分开写成函数比较舒服。
LeetCode13 Roman to Integer 罗马转为数字
标签:java java leetcode 解题代码 leetcode 算法
原文地址:http://blog.csdn.net/vvaaiinn/article/details/45194177