今天做的习题是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];
}
思路就是先创建与字符串长度相同的整数数组,根据相应位置的字母设置相应位置的整数值。 比较对应位置的整数值后其后一个位置的整数值,如果是大于等于的关系就加上这个位置的数,否则减去这个位置的数字,最后加上最后一位的数字。