首页 > 其他 > 详细

LeetCode12. 整数转罗马数字

时间:2021-05-10 10:37:37      阅读:19      评论:0      收藏:0      [点我收藏+]

LeetCode12. 整数转罗马数字

题目描述

 /**
     * 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
     * <p>
     * 字符          数值
     * I             1
     * V             5
     * X             10
     * L             50
     * C             100
     * D             500
     * M             1000
     * 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。
     * <p>
     * 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
     * <p>
     * 给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
     */

思路分析

  1. 数字转罗马数字,难点在于如何考虑整数的拆分
  2. 由罗马字符和数字的对应关系可得出七种映射关系,但是考虑如何处理罗马字符中的特殊的转换关系,即如果小字符在大字符的前边,执行减的操作
  3. 因为特殊的映射关系有五种,可以将两个罗马字符,即一个字符串用来对应一个数字,那么总共就有13种映射关系
  4. 即 I-1 IV-4 V-5 IX-9 X-10 XL-40 L-50 XC-90 C-100 CD-400 D-500 CM-900 M-1000
  5. 再观察罗马字符串的拼接规则,可知从大字符串到小字符串优先级依次降低的关系,即 优先使用大的罗马字符串,再使用小的
  6. 将这些映射关系存储到数组中,每拼接一个字符串,对应的数字值减去相映射的值,直到0为止
  7. 使用可变字符串依次拼接这些罗马字符串

源码及详解

//数字转罗马数字
    //思路分析
    //1. 要将一个数字转化为罗马字符串,首先考虑的应该是将这个数字转换为符合罗马字符规则的整数的组合
    //2. 考虑如果小的罗马字符在大下罗马字符的左侧的话,执行减的操作
    //3. 考虑将这些特殊的组合字符当作一个串,也就是一个字符来处理
    //4. 综合以上,罗马字符对应的数字应该是有13种对应关系
    //5. I-1 IV-4 V-5 IX-9 X-10 XL-40 L-50 XC-90 C-100 CD-400 D-500 CM-900 M-1000
    //6. 将这些字符和数字对应的关系存储到数组中
    //7. 然后拆分给定的数字,拆分应该按照罗马字符由大到小的顺序
    public String intToRoman(int num) {
        //先进行数字校验
        if (num < 0) {
            return "";
        }
        //定义数组保存特殊的罗马字符和对应的数字
        int[] ints = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        //定义一个可变长字符串保存拆分后的罗马字符串
        StringBuffer buffer = new StringBuffer();

        //遍历数字数组,选择这个数字的拆分项
        for (int i = 0; i < ints.length; i++) {
            //循环比较
            while (num >= ints[i]) {
                //num 减去要拼接的数字大小
                num -= ints[i];
                //字符串拼接
                buffer.append(romans[i]);
            }

        }
        //返回
        return buffer.toString();

    }

LeetCode12. 整数转罗马数字

原文:https://www.cnblogs.com/mx-info/p/14749676.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!