模拟法:
列表
思路:为了表示一个给定的整数num,寻找不超过num的最大符号值,用num减去该符号值,然后继续找不超过num的符号值,循环直至到0。最后得到的字符串就是num的罗马数字表示。
建立数值-符号对的列表valueSymbols,按数值从大到小排列。遍历每个数值-符号对,如果当前数值不超过当前num,则从num中不断减去value,直至num小于value,再遍历下一个数值-符号对。循环到num的值为0跳出循环。
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;
}
};