代码重构:leetcode 12. 整数转罗马数字

101 阅读1分钟

12. 整数转罗马数字

就是一个模拟,每次处理完的结果都要是比之前的值小,比如处理完1000后,必须比1000小。

但这个程序实际上带来了两个问题:

  1. 如果追求代码的可读性和可扩展性,就会导致空间和时间的损失
  2. 追求时间和空间,就是使得代码写得难看

下面给出两种写法:

  1. 代码可读性较强,扩展性较强,但速度慢
  public String intToRoman(int num) {
        TreeMap<Integer, String> MAP = preSolve();
        StringBuilder builder = new StringBuilder();
        for (Map.Entry<Integer, String> entry : MAP.entrySet()) {
            if (num==0) break;
            while (num >= entry.getKey()) {
                builder.append(entry.getValue());
                num -= entry.getKey();
            }
        }
        return builder.toString();
    }

    public TreeMap<Integer, String> preSolve() {
        TreeMap<Integer, String> Map = new TreeMap<>((o1, o2) -> o2 - o1);
        String[] map = {"I", "IV", "V", "IX","X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};
        int[] ints = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
        for (int i = 0; i < map.length; i++) {
            Map.put(ints[i], map[i]);
        }
        return Map;
    }
  1. 代码可读性差,但是速度快,空间小 ps:写这个代码让我感觉自己好像机器人......
  public String intToRoman(int num) {
        StringBuilder builder = new StringBuilder();
        while (num != 0) {
            if (num>=1000){
                builder.append("M");
                num-=1000;
            }else if (num>=900){
                builder.append("CM");
                num-=900;
            }else if (num>=500){
                builder.append("D");
                num-=500;
            }else if (num>=400){
                builder.append("CD");
                num-=400;
            }else if (num>=100){
                builder.append("C");
                num-=100;
            }else if (num>=90){
                builder.append("XC");
                num-=90;
            }else if (num>=50){
                builder.append("L");
                num-=50;
            }else if (num>=40){
                builder.append("XL");
                num-=40;
            }else if (num>=10){
                builder.append("X");
                num-=10;
            }else if (num>=9){
                builder.append("IX");
                num-=9;
            }else if (num>=5){
                builder.append("V");
                num-=5;
            }else if (num>=4){
                builder.append("IV");
                num-=4;
            }else{
                builder.append("I");
                num-=1;
            }
        }
        return builder.toString();
    }