12.integer to Roman
//罗马数字不是很懂,结果糊涂到 49 999 都用两个罗马数字表示 结果错了 因为 每个罗马数字最多用三次
class Solution {//本题的思路很简单 就是一直循环到满足下一个循环条件
public String intToRoman(int num) {//解法容易 写法啰嗦 然后我看了其他人的写法 自己也分析了以下
String result = "";
while (num >= 1000) {
result += "M";
num -= 1000;
}
while (num >= 900) {
result += "CM";
num -= 900;
}
while (num >= 500) {
result += "D";
num -= 500;
}
while (num >= 400) {
result += "CD";
num -= 400;
}
while (num >= 100) {
result += "C";
num -= 100;
}
while (num >= 90) {
result += "XC";
num -= 90;
}
while (num >= 90) {
result += "XC";
num -= 90;
}
while (num >= 50) {
result += "L";
num -= 50;
}
while (num >= 40) {
result += "XL";
num -= 40;
}
while (num >= 10) {
result += "X";
num -= 10;
}
while (num >= 9) {
result += "IX";
num -= 9;
}
while (num >= 5) {
result += "V";
num -= 5;
}
while (num >= 4) {
result += "IV";
num -= 4;
}
while (num >= 1) {
result += "I";
num -= 1;
}
return result;
}
}
别的大佬的做法 我也分析了以下 加了旁注
//两道题思路差不多
class Solution {
private String[] symbols = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};//创建一个数组 保存各种形式的两个罗马数组合以及单个
private int[] values = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000, Integer.MAX_VALUE};//跟上面一一对应 最后加上了一个int最大值
public String intToRoman(int num) {
StringBuilder builder = new StringBuilder();//创建一个可变的字符串 因为性能的原因 不用 str+str2的 方法 我也转载了一篇StringBuilder()的介绍
int input = num;
while(input > 0){//循环条件输入不为0
int index = getNearestIndex(input);//索引 index
builder.append(symbols[index]);
input -= values[index];//减去已经加进去字符串种所对应的值
}
return builder.toString();//返回整个字符串
}
public int getNearestIndex(int num){
int index = 0;
while(index < values.length){//一个一个索引
if(values[index] < num){//value[]是从小到大排序
index++;
} else if(values[index] > num){
return index - 1;
} else {
break;//找到了跳出来
}
}
return index;
}
}