这题思路比较暴力比较简单:
- 利用map,做一个特殊字符的映射
static {
map.put(1, "I");
map.put(5, "V");
map.put(10, "X");
map.put(50, "L");
map.put(100, "C");
map.put(500, "D");
map.put(1000, "M");
//特殊情况
map.put(4, "IV");
map.put(9, "IX");
map.put(40, "XL");
map.put(90, "XC");
map.put(400, "CD");
map.put(900, "CM");
}
- 用5作为分界线,小于single<5的就是在左边👈添加对应缺少的数字,对应大于single>5的,则在右边👉添加
//检查单个数字是否属于已有罗马数字范畴
public static String check(int single) {
//判断是否包含已有情况,还得判断i的i情况
if (map.containsKey(single)) {
//包含,直接返回
return map.get(single);
} else {
StringBuilder res = new StringBuilder();
//拆分,先判断是否大于5,先固定5,在往右边加入数字
if (single > 5) {
res.append(map.get(5));
int t = single - 5;
for (int j = 0; j < t; j++) {
res.append(map.get(1));
}
} else {
for (int j = 0; j < single; j++) {
res.append(map.get(1));
}
}
return res.toString();
}
}
//检查单个数字是否属于已有罗马数字范畴
public static String check(int i, int single) {
int pow = (int) Math.pow(10, i);
//判断是否包含已有情况,还得判断i的i情况
if (map.containsKey(single)) {
//包含,直接返回
return map.get(single * pow);
} else {
StringBuilder res = new StringBuilder();
//拆分,先判断是否大于5,先固定5,在往右边加入数字
if (single > 5) {
res.append(map.get(5 * pow));
int t = single - 5;
for (int j = 0; j < t; j++) {
res.append(map.get(1 * pow));
}
}else{
for (int j = 0; j < single; j++) {
res.append(map.get(1 * pow));
}
}
return res.toString();
}
- single怎么取?利用mod(%)运算,每次去num的余数作为我们的single,再通过num/10取下一位,利用i记录被除的次数,就可以得知当前的数字是属于第几位。
public static String intToRoman(int num) {
//要找出能区分特殊情况的方法
StringBuilder str = new StringBuilder();
//运行计算器,计算到第几位,对应成多少个10 ex:1994
int i = 0;
//简单除法
while (num != 0) {
//取出当前数字
int single = num % 10;
if(i>0){
String key = check(i,single);
str.insert(0, key);
}else{
String key = check(single);
str.insert(0, key);
}
num = num / 10;
i++;
}
return str.toString();
}
例如:58%10=8,single=8,8>5,他肯定有一个V,现在前面加V,然后取剩下的数3(8-5=3),递归给V右边加上III,➡️ VIII。
接着58/10 =5,i++ 🉐️ i=1。利用pow函数算出当前single为50,由于50属于特殊的一种,可以直接返回L
p拼接起来就是LVIII
上面的情况我是把个位和其他位数的分开进行讨论的,应该是有合起来的情况可以更简洁的展示代码,以下是全部的代码:
class Solution {
public static final HashMap<Integer, String> map = new HashMap();
static {
map.put(1, "I");
map.put(5, "V");
map.put(10, "X");
map.put(50, "L");
map.put(100, "C");
map.put(500, "D");
map.put(1000, "M");
//特殊情况
map.put(4, "IV");
map.put(9, "IX");
map.put(40, "XL");
map.put(90, "XC");
map.put(400, "CD");
map.put(900, "CM");
}
public static String intToRoman(int num) {
//要找出能区分特殊情况的方法
StringBuilder str = new StringBuilder();
//运行计算器,计算到第几位,对应成多少个10 ex:1994
int i = 0;
//简单除法
while (num != 0) {
//取出当前数字
int single = num % 10;
if(i>0){
String key = check(i,single);
str.insert(0, key);
}else{
String key = check(single);
str.insert(0, key);
}
num = num / 10;
i++;
}
return str.toString();
}
//检查单个数字是否属于已有罗马数字范畴
public static String check(int single) {
//判断是否包含已有情况,还得判断i的i情况
if (map.containsKey(single)) {
//包含,直接返回
return map.get(single);
} else {
StringBuilder res = new StringBuilder();
//拆分,先判断是否大于5,先固定5,在往右边加入数字
if (single > 5) {
res.append(map.get(5));
int t = single - 5;
for (int j = 0; j < t; j++) {
res.append(map.get(1));
}
} else {
for (int j = 0; j < single; j++) {
res.append(map.get(1));
}
}
return res.toString();
}
}
//检查单个数字是否属于已有罗马数字范畴
public static String check(int i, int single) {
int pow = (int) Math.pow(10, i);
//判断是否包含已有情况,还得判断i的i情况
if (map.containsKey(single)) {
//包含,直接返回
return map.get(single * pow);
} else {
StringBuilder res = new StringBuilder();
//拆分,先判断是否大于5,先固定5,在往右边加入数字
if (single > 5) {
res.append(map.get(5 * pow));
int t = single - 5;
for (int j = 0; j < t; j++) {
res.append(map.get(1 * pow));
}
}else{
for (int j = 0; j < single; j++) {
res.append(map.get(1 * pow));
}
}
return res.toString();
}
}
}