class Solution {
public:
string intToRoman(int num) {
string ans="";
int temp=num/1000;
num=num%1000;
for(int i=temp;i>0;--i) ans+="M";
temp=num/100;
num=num%100;
if(temp<4)
for(int i=temp;i>0;--i) ans+="C";
else if(temp==4) ans+="CD";
else if(temp<9){
ans+="D";
for(int i=temp;i>5;--i) ans+="C";
}
else ans+="CM";
temp=num/10;
num=num%10;
if(temp<4)
for(int i=temp;i>0;--i) ans+="X";
else if(temp==4) ans+="XL";
else if(temp<9){
ans+="L";
for(int i=temp;i>5;--i) ans+="X";
}
else ans+="XC";
temp=num;
if(temp<4)
for(int i=temp;i>0;--i) ans+="I";
else if(temp==4) ans+="IV";
else if(temp<9){
ans+="V";
for(int i=temp;i>5;--i) ans+="I";
}
else ans+="IX";
return ans;
}
};
对3999以下才有用的屑类机械式算法(
讲道理除法耗时略久,所以泛用性小效率也不高,就是不用做表,空间小点。
再转一个力扣上嫖的贪心算法版:
class Solution {
public:
string intToRoman(int num) {
string strs[]= {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
int nums[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
string ans;
for (int i = 0; num > 0 && i < 13; i++) {
while (nums[i] <= num) {
ans += strs[i];
num -= nums[i];
}
}
return ans;
}
};
每次减去表中能减的最大的数,然后加上对应罗马数字字符,鉴于输入数字再大也就那么点,所以时间复杂度可以算O(1),并且对任意数字有效。