12、整数转罗马数字

问题描述

在这里插入图片描述

问题分析

分析题目,可以这样考虑:按照罗马字符所表示的范围进行分层,依次匹配罗马字符,然后更新原数字,迭代进行,最终得到结果。


第一种解法:比较范围+迭代

罗马字符所表示的范围为:

  1. 1000-3999 M
  2. 900-1000 CM
  3. 500-900 D
  4. 400-500 CD
  5. 100-400 C
  6. 90-100 XC
  7. 50-90 L
  8. 40-50 XL
  9. 10-40 X
  10. 9 IX
  11. 5-9 V
  12. 4 IV
  13. 1-4 I

主要的时间花费在迭代时的比较上。

Java代码

class Solution {
    public String intToRoman(int num) {

        String result = "";

        while (num > 0){
            if (num >= 1000){
                num -= 1000;
                result = result+"M";
            }else if (num >= 900 && num < 1000){
                num -= 900;
                result = result+"CM";
            }else if (num >= 500 && num < 900){
                num -= 500;
                result = result+"D";
            }else if (num >= 400 && num < 500){
                num -= 400;
                result = result+"CD";
            }else if (num >= 100 && num < 400){
                num -= 100;
                result = result+"C";
            }else if (num >= 90 && num < 100){
                num -= 90;
                result = result+"XC";
            }else if (num >= 50 && num < 90){
                num -= 50;
                result = result+"L";
            }else if (num >= 40 && num < 50){
                num -= 40;
                result = result+"XL";
            }else if (num >= 10 && num < 40){
                num -= 10;
                result = result+"X";
            }else if (num >= 9 && num < 10){
                num -= 9;
                result = result+"IX";
            }else if (num >= 5 && num < 9){
                num -= 5;
                result = result+"V";
            }else if (num >= 4 && num < 5){
                num -= 4;
                result = result+"IV";
            }else if (num >= 1 && num < 4){
                num -= 1;
                result = result+"I";
            }
        }

        return result;
    }
}

结果分析

以上代码的执行结果:

执行时间内存消耗
25ms41.2MB

在这里插入图片描述


第二种解法:记录法(优化)

第一种方法的时间主要花费在比较上,数字在减小,但是每次还是从范围1000开始比较,进行了很多重复而无意义的比较操作。我们可以用记录法记录上次比较结束的地方,下次比较就直接从记录的地方开始即可。

Java代码

class Solution {
    public String intToRoman(int num) {
        StringBuilder sb = new StringBuilder();
        int[] value = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
        String[] symbol = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};
        int n = value.length;

        for(int i = n - 1; i >= 0; i--) {
            if(num >= value[i]) {
                int count = num / value[i];
                num %= value[i];
                while(count-- > 0) {
                    sb.append(symbol[i]);
                }
            }
        }

        return sb.toString();
    }
}

结果分析

以上代码的执行结果:

执行时间内存消耗
21ms38.1MB

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值