整数转罗马数字-力扣-LeetCode

描述

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/integer-to-roman
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

之前做过一个罗马数字转整数,当时简单的想法就是遍历字符串,用switch进行选择,后来看到有个简单的用map的做法
这个题是整数转罗马数,但是与罗马数串相比,整数有太多的可能性,所以我就用了最简单,也是最容易懂得方法:if语句
1、个位数的处理,十位数的处理,百位数的处理,千位数的处理
2、因为规定了最大是3999,所以就好做多了
3、这个方法虽然简单,但是还是可以进行很多优化的,比如这三种方法可以合并成一种,然后根据是几位数来进行罗马数字的选择,但是我懒得写了

代码
public static String intToRoman(int num) {
        StringBuilder str = new StringBuilder();
        String s = String.valueOf(num);
        int len = s.length();
        for (int i = len - 1; i >= 0; i--) {
            int n = Integer.parseInt(String.valueOf(s.charAt(len - 1 - i)));
            if (i == 0) {
                String one = One(n);
                str.append(one);
            }
            if (i == 1) {
                String ten = Ten(n);
                str.append(ten);
            }
            if (i == 2) {
                String hundred = Hundred(n);
                str.append(hundred);
            }
            if (i == 3) {
                String thousand = Thousand(n);
                str.append(thousand);
            }
        }


        return String.valueOf(str);
    }
    public static String One(int n) {
        StringBuilder str = new StringBuilder();
        if (n < 5) {
            if (n == 4) {
                return "IV";
            } else {
                for (int i = 0; i < n; i++) {
                    str.append("I");
                }
            }
        } else {
            if (n == 9) {
                return "IX";
            } else {
                str.append("V");
                for (int i = 5; i < n; i++) {
                    str.append("I");
                }
            }
        }
        return String.valueOf(str);
    }
    public static String Ten(int n) {
        StringBuilder str = new StringBuilder();
        if (n < 5) {
            if (n == 4) {
                return "XL";
            } else {
                for (int i = 0; i < n; i++) {
                    str.append("X");
                }
            }
        } else {
            if (n == 9) {
                return "XC";
            } else {
                str.append("L");
                for (int i = 5; i < n; i ++) {
                    str.append("X");
                }
            }
        }
        return String.valueOf(str);
    }
    public static String Hundred(int n) {
        StringBuilder str = new StringBuilder();
        if (n < 5) {
            if (n == 4) {
                return "CD";
            } else {
                for (int i = 0; i < n; i++) {
                    str.append("C");
                }
            }
        } else {
            if (n == 9) {
                return "CM";
            } else {
                str.append("D");
                for (int i = 5; i < n; i++) {
                    str.append("C");
                }
            }
        }
        return String.valueOf(str);
    }
    public static String Thousand(int n) {
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < n; i++) {
            str.append("M");
        }
        return String.valueOf(str);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值