12.整数转罗马数字

作者 : XiaXinyu
日期 :2021-10-02

题目

理解题意

给定一个整数,按照罗马数字的表示方法将其转换为罗马数字,进行模拟即可

题解1

罗马数字中一共包含13个字符,其中包括6个复合字符

为了表示整数n,可以不断寻找不超过n的最大整数值,并将该整数值转换为罗马字符,然后再不断减去该整数值,直到n等于0,这时即完成转换

class Solution {
    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"};
    public String intToRoman(int num) {
        StringBuffer roman = new StringBuffer(); //不要将答案定义为String然后做+=操作,因为String是常量,重新创建对象很耗时
        for(int i = 0;i < 13;i ++){
            while(values[i] <= num){ //寻找不超过num的最大整数值
                num -= values[i];
                roman.append(symbols[i]); 

            }
            if(num == 0) break;
        }
        return roman.toString();
    }
}

时间复杂度 :O(1) 最多执行13次循环

空间复杂度 :O(1)

题解2(硬编码做法)

可以发现从个位到千位,不同位的数字都有自己的表示方式,个位、十位、百位各有10种表示方式,而千位只有4种(0也算一种表示方式,对应空字符串)

然后可以将4个不同位的数字表示分为四组,根据每位的数字直接转换为古罗马数字

所以整体思路就是利用取模和除法操作进行数位分离,然后根据不同位的数字进行查表转换

代码
class Solution {
    String[] thousands = {"", "M", "MM", "MMM"};
    String[] hundreds  = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
    String[] tens      = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
    String[] ones      = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

    public String intToRoman(int num) {
        StringBuffer roman = new StringBuffer();
        roman.append(thousands[num / 1000]);
        roman.append(hundreds[num % 1000 / 100]);
        roman.append(tens[num % 100 / 10]);
        roman.append(ones[num % 10]);
        return roman.toString();
    }
}

时间复杂度 :O(1)

空间复杂度 :O(1)

个人感觉这种做法还是很巧妙的,再回头看看自己AC时的代码,水平差太多啦哈哈哈

读算法千遍不如自己实现一遍,加油!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiaXinyuuu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值