今天做的習題是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];
}
思路就是先創建與字符串長度相同的整數數組,根據相應位置的字母設置相應位置的整數值。比較對應位置的整數值後其後一個位置的整數值,如果是大於等於的關係就加上這個位置的數,否則減去這個位置的數字,最後加上最後一位的數字。