Roman to Integer

今天做的习题是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];
		}

思路就是先创建与字符串长度相同的整数数组,根据相应位置的字母设置相应位置的整数值。比较对应位置的整数值后其后一个位置的整数值,如果是大于等于的关系就加上这个位置的数,否则减去这个位置的数字,最后加上最后一位的数字。
发布了36 篇原创文章 · 获赞 0 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章