Leetcode演算法練習-easy篇-Roman to Integer
阿新 • • 發佈:2019-01-01
題目簡述:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
上圖:
本題解法:
int retValue(char a)
{
if(a == 'M')
return 1000;
if(a == 'D')
return 500;
if(a == 'C')
return 100;
if(a == 'L')
return 50;
if(a == 'X')
return 10;
if(a == 'V')
return 5;
if(a == 'I')
return 1;
}
int retPra(char a)
{
int ret = 0;
if(a == 'M'){
ret = 7;
goto End;
}
if(a == 'D'){
ret = 6;
goto End;
}
if(a == 'C'){
ret = 5 ;
goto End;
}
if(a == 'L'){
return 4;
goto End;
}
if(a == 'X'){
ret = 3;
goto End;
}
if(a == 'V'){
ret = 2;
goto End;
}
if(a == 'I'){
ret = 1;
goto End;
}
End :
return ret;
}
class Solution {
public :
int romanToInt(string s) {
int ret = 0;
int s1 = 0, s2 = 0;
for(int i = 0; i < s.length(); i++)
{
s1 = retPra(s[i]);
s2 = retPra(s[i + 1]);
if(s1 < s2)
{
ret += retValue(s[i + 1]) - retValue(s[i]);
i++;
}
else
ret += retValue(s[i]);
}
return ret;
}
};
然後就是再來看一下比較好的解法:
7msJAVA解法
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];
}
比較高效的部分應該就是直接生成陣列,並在陣列中進行比較加減。
總結:本次採用C++實現,有意思的部分就是羅馬數字的排列方式了,在下面附的是羅馬數字的排列規則:(來自百度)
1-10就是: I II III IV V VI VII VIII IX X .
就是一個I代表一根手指表示1.
兩個當然就是2.然後V表示的就是一隻手也就是5.
然後放在大數左邊的小數是減,如IV是4.
放在大數右邊的小數是加如VI是6.
然後X表示兩隻手也就是10.剩下的就跟阿拉伯數字一樣組合起來就好了.
20是XX 30是XXX 因為50是L,所以40是XL.然後60LX 70LXX 80LXXX 100是C.所以90是XC.然後十位和個位組合就好了.再附個表