Leetcode中等题12整数转罗马数字(Java)

本道题的思路是将1000, 500, 100, 50, 10, 5, 1对应的罗马数字按序存入数组strs中(索引为0,1,2,3,4,5,6),先计算千、百、十、个为书上的值,将其存入数组中(索引为0,1,2,3),千位数没有特殊情况,StringBuilder变量直接循环拼接千位数的值个 对应的罗马数字,而百、十、个位就需要考虑特殊情况,应为情况相似,可以在循环中判断,一共需要分为四种情况(=9,=4,>= 5, <5),如果值为9,则先拼接strs[2*i],再拼接strs[2*i-2],如果值为4,则先拼接strs[2*i],再拼接strs[2*i-1],如果大于5,则先拼接strs[2*i - 1],再循环凭借(n-5)个strs[2i],如果小于5,则循环凭借n个strs[2i]

class Solution {

    public String intToRoman(int num) {

        int dLength = 4, length = 7;

        StringBuilder sb = new StringBuilder();

        int[] divisors = {1000, 500, 100, 50, 10, 5, 1};

        String[] strs = {"M", "D", "C", "L", "X", "V", "I"};

        int[] results = new int[dLength];

        for (int i=0;i<dLength;i++) {

            int result = num / divisors[2*i];

            num = num % divisors[2*i];

            results[i] = result;

        } 

        int result = results[0];

        while (result != 0) {

            sb.append(strs[0]);

            result -- ;

        }

        for (int i = 1;i<dLength;i++) {

            result = results[i];

            if (result == 9) {

                sb.append(strs[2*i]);

                sb.append(strs[2*i - 2]);

            } else if (result == 4) {

                sb.append(strs[2*i]);

                sb.append(strs[2*i - 1]);

            } else if (result >= 5) {

                sb.append(strs[2*i - 1]);

                while ((result - 5) != 0) {

                    sb.append(strs[2*i]);

                    result --;

                }

            } else {

                while (result != 0) {

                    sb.append(strs[2*i]);

                    result -- ;

                }

            }

        }

        return sb.toString();

    }

}

不过性能不是很好,有待提高,有更好的易于理解的高性能的方法可以分享给我哟 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值