leetcode第12题整数转罗马数字
用的贪心算法,每次求的都是最优解,思路很简单,啪啪的就写完了,很快啊!
class Solution {
public String intToRoman(int num) {
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"};
StringBuilder stringBuilder = new StringBuilder();
int index = 0;
int len = values.length - 1;
while (index < values.length) {
if (num >= values[index]) {
stringBuilder.append(symbols[index]);
//疑问?这里为什么不能index++呢?
//解答: 举一个例子 3这个数字转为罗马数字III 肯定是三个I进行叠加的,要不循环就跑出去了.
num -= values[index];
} else {
index++;
}
}
return stringBuilder.toString();
}
}
这种解题的思路,相对来说就笨了很多,但是核心的思想还是大同小异,将所有的情况都列举出来,得到对应的字符串,进行拼接,具体数字的取余啊!每次将数字减小一位数,思路还是很清晰的.
public String getRoman(int num, int count) { //count 表示当前的位数,个位,⼗位...
char[] ten = {'I', 'X', 'C', 'M'}; //1,10,100,1000
char[] five = {'V', 'L', 'D'};//5,50,500
String r = "";
if (num <= 3) {
while (num != 0) {
r += ten[count];
num--;
}
}
if (num == 4) {
r = (ten[count] + "") + (five[count] + "");
}
if (num == 5) {
r = five[count] + "";
}
if (num > 5 && num < 9) {
r = five[count] + "";
num -= 5;
while (num != 0) {
r += ten[count];
num--;
}
}
if (num == 9) {
r = (ten[count] + "") + (ten[count + 1] + "");
}
return r;
}
public String intToRoman(int num) {
String r = "";
int count = 0;
while (num != 0) {
int pop = num % 10;
r = getRoman(pop, count) + r;
count++;
num /= 10;
}
return r;
}