Leetcode学习之 12.整数转罗马数字

这题思路比较暴力比较简单:

  1. 利用map,做一个特殊字符的映射
static {
        map.put(1, "I");
        map.put(5, "V");
        map.put(10, "X");
        map.put(50, "L");
        map.put(100, "C");
        map.put(500, "D");
        map.put(1000, "M");
        //特殊情况
        map.put(4, "IV");
        map.put(9, "IX");
        map.put(40, "XL");
        map.put(90, "XC");
        map.put(400, "CD");
        map.put(900, "CM");
    }
  1. 用5作为分界线,小于single<5的就是在左边👈添加对应缺少的数字,对应大于single>5的,则在右边👉添加
//检查单个数字是否属于已有罗马数字范畴
    public static String check(int single) {
        //判断是否包含已有情况,还得判断i的i情况
        if (map.containsKey(single)) {
            //包含,直接返回

            return map.get(single);
        } else {
            StringBuilder res = new StringBuilder();
            //拆分,先判断是否大于5,先固定5,在往右边加入数字
            if (single > 5) {
                res.append(map.get(5));
                int t = single - 5;
                for (int j = 0; j < t; j++) {
                    res.append(map.get(1));
                }
            } else {
                for (int j = 0; j < single; j++) {
                    res.append(map.get(1));
                }
            }
            return res.toString();
        }

    }

    //检查单个数字是否属于已有罗马数字范畴
    public static String check(int i, int single) {
        int pow = (int) Math.pow(10, i);
        //判断是否包含已有情况,还得判断i的i情况
        if (map.containsKey(single)) {
            //包含,直接返回

            return map.get(single * pow);
        } else {
            StringBuilder res = new StringBuilder();
            //拆分,先判断是否大于5,先固定5,在往右边加入数字
            if (single > 5) {
                res.append(map.get(5 * pow));
                int t = single - 5;
                for (int j = 0; j < t; j++) {
                    res.append(map.get(1 * pow));
                }
            }else{
                for (int j = 0; j < single; j++) {
                    res.append(map.get(1 * pow));
                }
            }
            return res.toString();
        }
  1. single怎么取?利用mod(%)运算,每次去num的余数作为我们的single,再通过num/10取下一位,利用i记录被除的次数,就可以得知当前的数字是属于第几位。
    public static String intToRoman(int num) {
        //要找出能区分特殊情况的方法
        StringBuilder str = new StringBuilder();
        //运行计算器,计算到第几位,对应成多少个10   ex:1994
        int i = 0;
        //简单除法
        while (num != 0) {
            //取出当前数字
            int single = num % 10;
            if(i>0){
                String key = check(i,single);
                str.insert(0, key);
            }else{
                String key = check(single);
                str.insert(0, key);
            }
            num = num / 10;
            i++;
        }
        return str.toString();
    }

例如:58%10=8,single=8,8>5,他肯定有一个V,现在前面加V,然后取剩下的数3(8-5=3),递归给V右边加上III,➡️ VIII。
接着58/10 =5,i++ 🉐️ i=1。利用pow函数算出当前single为50,由于50属于特殊的一种,可以直接返回L
p拼接起来就是LVIII

上面的情况我是把个位和其他位数的分开进行讨论的,应该是有合起来的情况可以更简洁的展示代码,以下是全部的代码:

class Solution {
    public static final HashMap<Integer, String> map = new HashMap();
    static {
        map.put(1, "I");
        map.put(5, "V");
        map.put(10, "X");
        map.put(50, "L");
        map.put(100, "C");
        map.put(500, "D");
        map.put(1000, "M");
        //特殊情况
        map.put(4, "IV");
        map.put(9, "IX");
        map.put(40, "XL");
        map.put(90, "XC");
        map.put(400, "CD");
        map.put(900, "CM");
    }

    public static String intToRoman(int num) {
        //要找出能区分特殊情况的方法
        StringBuilder str = new StringBuilder();
        //运行计算器,计算到第几位,对应成多少个10   ex:1994
        int i = 0;
        //简单除法
        while (num != 0) {
            //取出当前数字
            int single = num % 10;
            if(i>0){
                String key = check(i,single);
                str.insert(0, key);
            }else{
                String key = check(single);
                str.insert(0, key);
            }
            num = num / 10;
            i++;
        }
        return str.toString();
    }

    //检查单个数字是否属于已有罗马数字范畴
    public static String check(int single) {
        //判断是否包含已有情况,还得判断i的i情况
        if (map.containsKey(single)) {
            //包含,直接返回

            return map.get(single);
        } else {
            StringBuilder res = new StringBuilder();
            //拆分,先判断是否大于5,先固定5,在往右边加入数字
            if (single > 5) {
                res.append(map.get(5));
                int t = single - 5;
                for (int j = 0; j < t; j++) {
                    res.append(map.get(1));
                }
            } else {
                for (int j = 0; j < single; j++) {
                    res.append(map.get(1));
                }
            }
            return res.toString();
        }

    }

    //检查单个数字是否属于已有罗马数字范畴
    public static String check(int i, int single) {
        int pow = (int) Math.pow(10, i);
        //判断是否包含已有情况,还得判断i的i情况
        if (map.containsKey(single)) {
            //包含,直接返回

            return map.get(single * pow);
        } else {
            StringBuilder res = new StringBuilder();
            //拆分,先判断是否大于5,先固定5,在往右边加入数字
            if (single > 5) {
                res.append(map.get(5 * pow));
                int t = single - 5;
                for (int j = 0; j < t; j++) {
                    res.append(map.get(1 * pow));
                }
            }else{
                for (int j = 0; j < single; j++) {
                    res.append(map.get(1 * pow));
                }
            }
            return res.toString();
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值