题目链接
解法
一、哈希
不难发现,不同数位上的0~9都与特定字符串有一一对应关系,所以我们使用哈希表,依次将整数的每一位转换成对应的字符串,即罗马数字。
代码如下:
class Solution {
public:
string intToRoman(int num) {
map<int, string> s1 = { {0, ""},
{1, "I"}, {2, "II"}, {3, "III"},
{4, "IV"}, {5, "V"}, {6, "VI"},
{7, "VII"}, {8, "VIII"}, {9, "IX"}
};
map<int, string> s2 = { {0, ""},
{1, "X"}, {2, "XX"}, {3, "XXX"},
{4, "XL"}, {5, "L"}, {6, "LX"},
{7, "LXX"}, {8, "LXXX"}, {9, "XC"}
};
map<int, string> s3 = { {0, ""},
{1, "C"}, {2, "CC"}, {3, "CCC"},
{4, "CD"}, {5, "D"}, {6, "DC"},
{7, "DCC"}, {8, "DCCC"}, {9, "CM"}
};
map<int, string> s4 = { {0, ""},
{1, "M"}, {2, "MM"}, {3, "MMM"}
};
string ans = s4[num / 1000] + s3[(num % 1000) / 100] + s2[(num % 100) / 10] + s1[(num % 10)];
return ans;
}
};
还是哈希
我们发现,对于整数的每一位,用来表示它的罗马数字无非就是1, 5加上特例4, 9。以1994为例,我们可以采用如下办法:
1994 > 1000,罗马数字字符串加上对应1000的M,减去1000994 > 900,罗马数字字符串加上对应900的CM,减去90094 > 90,罗马数字字符串加上对应90的XC,减去90- 最后剩余
4,罗马数字字符串加上对应4的IV,减去4,结束
所以,我们可以用更简便的哈希方法来解决这道题目。
代码如下:
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 ans;
for (int i = 0; i < 13; i ++) {
while (num >= values[i]) {
num -= values[i];
ans += reps[i];
}
}
return ans;
}
};