lintcode之整数转罗马数字,首先题目描述如下:
给定一个整数,将其转换成罗马数字。
返回的结果要求在1-3999的范围内。
4
-> IV
12
-> XII
21
-> XXI
99
-> XCIX
更多案例,请戳 http://literacy.kent.edu/Minigrants/Cinci/romanchart.htm
思路如下:
1、首先将罗马数字里面一些特殊的值单独表示出来,即1000,900,500,400等;
2、将这些值与对应的罗马字符存入一个map之中,以便后面对其的使用;
3、将数字表示成罗马文字,将数字对这些特殊的值做除法,从大到小依次除下去,得到最终的结果。
具体实现的C++代码如下:
class Solution {
public:
/**
* @param n The integer
* @return Roman representation
*/
string intToRoman(int n) {
// Write your code here
map<int,string> m={{1000,"M"}, {900,"CM"}, {500,"D"}, {400,"CD"}, {100,"C"}, {90,"XC"}, {50,"L"},
{40,"XL"}, {10,"X"}, {9,"IX"}, {5,"V"}, {4,"IV"}, {1,"I"}};
map<int,string>::iterator it;
it=m.end();
it--;
string res={""};
while(n>0)
{
int temp=n/(it->first);
n-=temp*(it->first);
for(;temp>0;temp--)
{
res+=(it->second);
}
it--;
}
return res;
}
};
代码中需要注意的事项:
1、平时没怎么用过map容器,在获取map里面的键值对的时候一般用到迭代器iterator;
2、要注意到map里面的键值对默认是按照键的从小到大排列,一开始没有注意到困扰了我一会,所以该题中的迭代器it要从最后一个数开始,即最大的数1000开始;
3、.end()用法指向的是容器的最后一个对象之后的位置,是一个不存在的对象,所以代码里面在it=m.end();后面加上了it--,使此时的it指向的是容器的最后一对键值对。