今天做的习题是Roman to Integer的LeetCode,比较简单,重点是转换规则要用好,其他就没有什么了。但做完题之后还是不太明白为什么要用这个算法。
思路为:1:将字符串转换为字符数组
2:对字符数组的每一个符号进行判断如果大于前一个符号则加上如果小于则加上后一个符号并且减去两倍的此符号
具体代码如下:
public class Solution { public int romanToInt(String s) { int graph[] = new int[400]; graph['I'] = 1; graph['V']=5; graph['X']=10; graph['L']=50; graph['C']=100; graph['D']=500; graph['M']=1000; char[] romanNum=s.toCharArray(); int sum=graph[romanNum[0]]; for(int i=0;i<romanNum.length-1;i++){ if(graph[romanNum[i]]>=graph[romanNum[i+1]]) sum+=graph[romanNum[i+1]]; else sum+=graph[romanNum[i+1]]-2*graph[romanNum[i]]; } return sum; }学到的新的做法就是将字母变成数组的序号进行赋值,每个字母代表不同的值。然后将罗马数字拆分成一个个字符找到每个字符对应的数字,再根据相应的法则进行加减,最终得出正确结果,这个算法的运行速度还算不错。
看了一下其他的算法,有的是不对的,有的视根据罗马数字的构造法则分出了很多特殊情况。
有一种很简单也很用以理解的方法就是:
public int romanToInt(String s) { int nums[]=new int[s.length()]; for(int i=0;i<s.length();i++){ switch (s.charAt(i)){ case 'M': nums[i]=1000; break; case 'D': nums[i]=500; break; case 'C': nums[i]=100; break; case 'L': nums[i]=50; break; case 'X' : nums[i]=10; break; case 'V': nums[i]=5; break; case 'I': nums[i]=1; break; } } int sum=0; for(int i=0;i<nums.length-1;i++){ if(nums[i]<nums[i+1]) sum-=nums[i]; else sum+=nums[i]; } return sum+nums[nums.length-1]; }思路就是先创建与字符串长度相同的整数数组,根据相应位置的字母设置相应位置的整数值。比较对应位置的整数值后其后一个位置的整数值,如果是大于等于的关系就加上这个位置的数,否则减去这个位置的数字,最后加上最后一位的数字。
新闻热点
疑难解答