地址:https://leetcode.com/problems/integer-to-roman/
Roman numerals are represented by seven different symbols: I
, V
, X
, L
, C
, D
and M
.
For example, two is written as II
in Roman numeral, just two one’s added together. Twelve is written as, XII
, which is simply X
+ II
. The number twenty seven is written as XXVII
, which is XX
+ V
+ II
.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII
. Instead, the number four is written as IV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX
. There are six instances where subtraction is used:
I
can be placed before V
(5) and X
(10) to make 4 and 9.X
can be placed before L
(50) and C
(100) to make 40 and 90.C
can be placed before D
(500) and M
(1000) to make 400 and 900.Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: 3
Output: “III”
Example 2:
Input: 4
Output: “IV”
Example 3:
Input: 9
Output: “IX”
Example 4:
Input: 58
Output: “LVIII”
Explanation: L = 50, V = 5, III = 3.
Example 5:
Input: 1994
Output: “MCMXCIV”
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
似乎感觉刷过roman转integer的问题?翻了下没找到。
嗯。。愚蠢的我写出了下面的实现=_=
class Solution {
public:
string intToRoman(int num) {
string res;
while (num) {
if (num >= 1000) {
res += "M";
num -= 1000;
}
else if (num >= 900) {
res += "CM";
num -= 900;
}
else if (num >= 500) {
res += "D";
num -= 500;
}
else if (num >= 400) {
res += "CD";
num -= 400;
}
else if (num >= 100) {
res += "C";
num -= 100;
}
else if (num >= 90) {
res += "XC";
num -= 90;
}
else if (num >= 50) {
res += "L";
num -= 50;
}
else if (num >= 40) {
res += "XL";
num -= 40;
}
else if (num >= 10) {
res += "X";
num -= 10;
}
else if (num >= 9) {
res += "IX";
num -= 9;
}
else if (num >= 5) {
res += "V";
num -= 5;
}
else if (num >= 4) {
res += "IV";
num -= 4;
}
else {
res += "I";
num--;
}
}
return res;
}
};
哈哈哈虽然很罗嗦,总是为数不多的一次就ac的题,,其实最简单的优化就是用两个数组,不用这么搞了
class Solution {
public:
string intToRoman(int num) {
string res = "";
vector val{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
vector str{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
for (int i = 0; i < val.size(); ++i) {
while (num >= val[i]) {
num -= val[i];
res += str[i];
}
}
return res;
}
};
因为这个问题里的数字是有范围的,因此可以根据这一个特点进行简化。手动算出千,百,十,个位的数字,并按照规则加在一起。
class Solution {
public:
string intToRoman(int num) {
vector thousand{ "","M","MM","MMM" };
vector hundred{ "","C","CC","CCC","CD","D","DC","DCC","DCCC","CM" };
vector ten{ "","X","XX","XXX","XL","L","LX","LXX","LXXX","XC" };
vector one{ "","I","II","III","IV","V","VI","VII","VIII","IX" };
return thousand[num / 1000] + hundred[(num % 1000) / 100] + ten[(num % 100) / 10] + one[num % 10];
}
};