对于这道题目来说,简单一点的思路就是把罗马数字的的特殊情况给标记出来,例如:4-"IV",9-"IX"。依此下来,因为题目所给的限制num的值在1到3999之间,所以只要列到关于1000的特殊罗马符号,就可以得到最终的答案。
方法一:用两个数组储存相应的特殊值和对应的符号,将num与值从小到大比较,当num大于相应的value值时,将与之对应的罗马字符加上字符串,直到num的值为0。
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 res;
for(int i = 0;i < 13;i++){
while(num >= values[i]){
nums -= values[i];
res += reps[i];
}
}
return res;
}
};
方法二:其实思路和方法一类似,也是储存特殊的值和对应的罗马符号,只不过只是简单的改了一下储存的方式,用c++中的pair储存。
简单的介绍一下pair:pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。
下面附上代码:
const pair<int,string> valueSymbols[] = {
{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"},
};
class Solution {
public:
string intToRoman(int num) {
string roman;
for(const auto &[value,symbol] : valueSymbols){
while(num >= value){
num -= value;
roman += symbol;
}
if(num == 0)break;
}
return roman;
}
};