12. Integer to Roman 数字转罗马串
12. Integer to Roman 数字转罗马串
Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.
逐位处理最后逆置
string intToRoman(int num) {
vector<int> sym = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
string res;
int i=-2;
for(int j=0;j<3;++j) {
i+=2;
int n=num%10;
if (n==5) {
res.push_back(sym[i+1]);
} else if (n>5) {
if (n == 9) {
res.push_back(sym[i+2]);
res.push_back(sym[i]);
} else {
n-=5;
for(int j=0;j<n;++j) res.push_back(sym[i]);
res.push_back(sym[i+1]);
}
} else {
if (n==4) {
res.push_back(sym[i+1]);
res.push_back(sym[i]);
} else {
for(int j=0;j<n;++j) res.push_back(sym[i]);
}
}
num/=10;
}
while(num--) res.push_back('M');
reverse(res.begin(), res.end());
return res;
}利用题目数值限制枚举
string intToRoman(int num) {
string romanPieces[]={"","I","II","III","IV","V","VI","VII","VIII","IX",
"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
"","M","MM","MMM","MMMM"};
return romanPieces[num/1000+30]+romanPieces[(num/100)%10+20]
+romanPieces[(num/10)%10+10]+romanPieces[num%10];
}收获
- 可以通过观察题目的限制条件进行枚举进一步用空间换时间
#枚举 #math