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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章