12 整数转罗马数字
目录
题目:
七个不同的符号代表罗马数字,其值如下:
| 符号 | 值 |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (
V) 减 1 (I):IV,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。 - 只有 10 的次方(
I,X,C,M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。
个人解法分析
- 创建一个hashMap用于存放键值对,其中key是Integer类型,value为Character类型;
- 创建一个数组,用于按照顺序存储元素,便于后边的操作
- 执行循环
- 当输入的字符是4或者9时,获取位数,然后进行计算,这里我们观察到以4开头的或者以9开头的,只需要加上对应位数-1的10的倍数即可。
- 否则的话再次循环判断nums数组,逐步通过减法的操作来进行数值削减
- 最后返回结果
class Solution {
public static String intToRoman(int num) {
HashMap<Integer,Character> hashMap = new HashMap<>();
hashMap.put(1,'I');
hashMap.put(5,'V');
hashMap.put(10,'X');
hashMap.put(50,'L');
hashMap.put(100,'C');
hashMap.put(500,'D');
hashMap.put(1000,'M');
int [] nums = {1000,500,100,50,10,5,1};
StringBuilder stringBuilder = new StringBuilder();
while(num!=0){
if(String.valueOf(num).startsWith("4") || String.valueOf(num).startsWith("9")){
int flag = String.valueOf(num).length(); //获取位数
int number = Integer.parseInt(String.valueOf(num).substring(0,1)) * (int)Math.pow(10,flag-1);
int number_2 = (int) Math.pow(10,flag-1);
stringBuilder.append(hashMap.get(number_2));
stringBuilder.append(hashMap.get(number_2 +number));
num -= number;
}else {
for (int i : nums) {
if(i <= num){
stringBuilder.append(hashMap.get(i));
num -= i;
break;
}
}
}
}
return stringBuilder.toString();
}
}
优化算法
这个算法主要是通过找规律的形式,将以4开头的以及以9开头的预设在数组中,执行速度相对较快。
public static 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();
for (int i = 0; i < values.length; i++) {
while (num >= values[i]) {
num -= values[i];
stringBuilder.append(symbols[i]);
}
}
return stringBuilder.toString();
}