【leetcode】羅馬數字轉整數
阿新 • • 發佈:2019-01-08
羅馬數字包含以下七種字元:I
, V
, X
, L
,C
,D
和 M
。
字元 數值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000
例如, 羅馬數字 2 寫做 II
,即為兩個並列的 1。12 寫做 XII
,即為 X
+ II
。 27 寫做 XXVII
, 即為 XX
+ V
+ II
。
通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 IIII
,而是 IV
。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 IX
I
可以放在V
(5) 和X
(10) 的左邊,來表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左邊,來表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左邊,來表示 400 和 900。
示例 1:
輸入: "III" 輸出: 3
示例 2:
輸入: "IV" 輸出: 4
示例 3:
輸入: "IX" 輸出: 9
示例 4:
輸入: "LVIII" 輸出: 58 解釋: C = 100, L = 50, XXX = 30, III = 3.
示例 5:
輸入: "MCMXCIV" 輸出:
在網上找了一種其他簡單的思路:即當前字元比相鄰右邊的字元對應的值小時,只需要直接在結果中減去當前字元的值,否則加上當前字元的值。但是這種思路不夠嚴謹,因為沒有考慮到相鄰字元的輸入是否合法。提交程式碼如下:int romanToInt(char* s) { char key[7]={'I','V','X','L','C','D','M'}; int val[7]={1,5,10,50,100,500,1000}; int result=0; while(*s!='\0' && *(s+1)!='\0') { int i=0; for(i=0;i<7;i++)//找到s當前字元對應的key陣列的下標,便於計算當前字元對應的數值 { if(*s==key[i]) { break; } } if(i==7)//出現了key陣列以外的字元,認為是非法輸入 { printf("invalide input s!\n"); return 0; } if(*(s)==key[6])//判斷當前字元是否是M,如果是,直接計算M的個數 { int count=0; while(*s==key[6]) { count++; s++; } result+=val[6]*count; } else if((*(s+1)==key[i+1])||((*s!=key[5])&&(*(s+1)==key[i+2])))//判斷相鄰兩個字元是否是減法關係 { printf("*s=%c,*(s+1)=%c\n",*s,*(s+1)); printf("result=%d,val[i+1]=%d,val[i]=%d\n",result,val[i+1],val[i]); if(*(s+1)==key[i+1]) { result+=(val[i+1]-val[i]); } if(*(s+1)==key[i+2]) { result+=(val[i+2]-val[i]); } printf("result=%d\n",result); s+=2; } else//判斷字元是否是重複,計算加法 { int count=0; while(*s==key[i]) { count++; s++; } result+=val[i]*count; } } if(*s!='\0') { int i=0; for(i=0;i<7;i++)//找到s當前字元對應的key陣列的下標,便於計算當前字元對應的數值 { if(*s==key[i]) { break; } } if(i==7)//出現了key陣列以外的字元,認為是非法輸入 { printf("invalide input s!\n"); return 0; } result+=val[i]; } return result; }
int chPos(char ch)//找出字元對應的陣列索引 { char key[7]={'I','V','X','L','C','D','M'}; int i=0; for(i=0;i<7;i++) { if(key[i]==ch) { break; } } return i;//i==7表示有異常輸入 } int romanToInt(char* s) { char key[7]={'I','V','X','L','C','D','M'}; int val[7]={1,5,10,50,100,500,1000}; int result=0; int s0=chPos(*s); int s1=chPos(*(s+1)); while(*s!='\0' && *(s+1)!='\0')//演算法思路:字元比相鄰右邊的字元對應的val小,那麼直接減去該字元對應的數字,否則加上該字元對應的數字 { if(s0==7 || s1==7) { printf("異常輸入字元\n"); return 0; } if(val[s0]<val[s1]) { result-=val[s0]; } else { result+=val[s0]; } s0=s1; s1=chPos(*(s+2)); s++; } int fin=chPos(*s); if(fin==7) { printf("異常輸入字元\n"); return 0; } result+=val[fin]; return result; }