Leetcode12 整数转罗马数字

88 阅读2分钟

12 整数转罗马数字

目录

题目:

七个不同的符号代表罗马数字,其值如下:

符号
I1
V5
X10
L50
C100
D500
M1000

罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:

  • 如果该值不是以 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次,请使用 减法形式

给定一个整数,将其转换为罗马数字。

个人解法分析

  1. 创建一个hashMap用于存放键值对,其中key是Integer类型,value为Character类型;
  2. 创建一个数组,用于按照顺序存储元素,便于后边的操作
  3. 执行循环
    1. 当输入的字符是4或者9时,获取位数,然后进行计算,这里我们观察到以4开头的或者以9开头的,只需要加上对应位数-1的10的倍数即可。
    2. 否则的话再次循环判断nums数组,逐步通过减法的操作来进行数值削减
  4. 最后返回结果
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();

    }