一、题目:
二、解法1——暴力法
罗列出每个位上所有可能出现,选择出每一位的罗马字
0:对应第一位数字4、
1:对应第二位数字2、
3:对应第三位数字6;
#include <string>
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
string intToRoman(int num)
{
string result;
vector<string> tmpVec1 = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
vector<string> tmpVec2 = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
vector<string> tmpVec3 = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
vector<string> tmpVec4 = {"", "M", "MM", "MMM"};
vector<vector<string>> store = {tmpVec1, tmpVec2, tmpVec3, tmpVec4};
result.append(store[3][num / 1000 % 10]);
result.append(store[2][num / 100 % 10]);
result.append(store[1][num / 10 % 10]);
result.append(store[0][num % 10]);
return result;
}
};
class Solution {
String[] thousands = {"", "M", "MM", "MMM"};
String[] hundreds = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
String[] tens = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
String[] ones = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
public String intToRoman(int num) {
StringBuffer roman = new StringBuffer();
roman.append(thousands[num / 1000]);
roman.append(hundreds[num % 1000 / 100]);
roman.append(tens[num % 100 / 10]);
roman.append(ones[num % 10]);
return roman.toString();
}
}
三、解法2——贪心法
列出所有特殊点,用贪心法将份string加到result
class Solution
{
public:
string intToRoman(int num)
{
string result;
vector<int> store = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
vector<string> strs = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
int storeSize = int(store.size());
//贪心法
for (int i = 0; i < storeSize; i++)
{
while (num >= store[i])
{
result.append(strs[i]);
num -= store[i];
}
}
return result;
}
};
class Solution {
int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
public String intToRoman(int num) {
StringBuffer roman = new StringBuffer();
for (int i = 0; i < values.length; ++i) {
int value = values[i];
String symbol = symbols[i];
while (num >= value) {
num -= value;
roman.append(symbol);
}
if (num == 0) {
break;
}
}
return roman.toString();
}
}
四、比较
两种算法的空间复杂度和时间复杂度都是O(1)。