输入为数字,转换为罗马字符
L: 50 C: 100 D: 500 M: 1000
数字范围: 1-3999
40:ⅠL
差不多这个感觉。
思路:通过求余数获得数字的每一位,然后根据位数转换为罗马数字
class Solution {
public:
string convert(int num, string one, string five, string ten){
if(num == 9) return one+ten;
if( num < 9&&num > 5){
cout << five+convert(num-5, one,five, ten)<< endl;
return five+convert(num-5, one,five, ten);}
if(num == 5) return five;
if(num == 4) return one+five;
string returnStr;
for(int i = 0; i<num; i++)
returnStr += one;
return returnStr;
}
string convert(int len, int num){
string roman;
switch(len){
case 1:
roman = convert(num, "I", "V", "X");
break;
case 2:
roman = convert(num, "X", "L", "C");
break;
case 3:
roman = convert(num, "C", "D", "M");
break;
case 4:
roman = convert(num, "M", " ", " ");
break;
}
return roman;
}
string intToRoman(int num) {
string roman = "";
int i = 1;
while(num){
roman = convert(i, num%10)+roman;
num/= 10;
i++;
}
return roman;
}
};
执行用时 : 96 ms, 在Integer to Roman的C++提交中击败了4.24% 的用户
内存消耗 : 30.8 MB, 在Integer to Roman的C++提交中击败了0.85% 的用户
没啥好说的,写的很复杂。尽可能的想把规则模拟出来,而不是解决这个问题。
看别人怎么写的:
解法1:
class Solution {
public:
string intToRoman(int num) {
int values[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
string reps[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
string response;
for(int i = 0;i<13;i++)
{
while(num>=values[i])//循环保证可以处理多次需要同样的罗马数字,如:XX二十
{
num -= values[i];
response += reps[i];
}
}
return response;
}
};
执行用时 : 112 ms, 在Integer to Roman的C++提交中击败了0.85% 的用户
内存消耗 : 30.8 MB, 在Integer to Roman的C++提交中击败了0.85% 的用户
nmdwsm 说好的28s执行范例呢?难道这还跟本地pc有关系吗
确实很简单,不过没有考虑更多的数,也就是只有有限性。不具有良好的扩展性。
从高位到低位,减去所能用到的,然后最后得到字符串,思路十分清晰。
看别人怎么写的解法2:
class Solution:
def intToRoman(self, num):
m = [
['', 'M', 'MM', 'MMM'],
['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'],
['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX']
]
d = [1000, 100, 10, 1]
r = ''
for k, v in enumerate(d):
r += m[k][int(num/v)]
num = num % v
return r
执行用时 : 88 ms, 在Integer to Roman的Python提交中击败了59.13% 的用户
内存消耗 : 10.7 MB, 在Integer to Roman的Python提交中击败了0.00% 的用户
这个。。好像更加有局限性吧,不过身为python,运行比c++快,也是说明了确实好用。
但是。。从0到10每个列出来。。。我佛了。。。。