乘风破浪:LeetCode真题_012_Integer to Roman

乘风破浪:LeetCode真题_012_Integer to Roman

一、前言

    经过了前面的思维训练,我们在某些方面有了一定的提高,但是对于实际的问题,要在短时间内得到答案,还是需要我们多多的练习和思考,从而提升自己的质疑能力,思考能力和编程能力。

二、Integer to Roman

2.1 问题理解

2.2 问题分析和解决

    通过分析我们可以知道,这是单位的换算问题,因此我们需要定义好相应的单位,然后通过取余运算,取整运算不断地进行下去,从而得到对应的单位,然后进行组合。因为有值域限制,我们能够写出所有的单位。

public class Solution {
    /**
     * <pre>
     * Given an integer, convert it to a roman numeral.
     *
     * Input is guaranteed to be within the range from 1 to 3999.
     *
     * 罗马数字的表示:
     * 个位数举例
     * (I, 1)  (II, 2)  (III, 3)  (IV, 4)  (V, 5)  (VI, 6)  (VII, 7)  (VIII, 8)  (IX, 9)
     *
     * 十位数举例
     * (X, 10)  (XI, 11)  (XII, 12)  (XIII, 13)  (XIV, 14)  (XV, 15)  (XVI, 16)
     * (XVII, 17)  (XVIII, 18)  (XIX, 19)  (XX, 20)  (XXI, 21)  (XXII, 22)
     * (XXIX, 29)  (XXX, 30)  (XXXIV, 34)  (XXXV, 35)  (XXXIX, 39)  (XL, 40)
     * (L, 50)  (LI, 51)  (LV, 55)  (LX, 60)  (LXV, 65)  (LXXX, 80)  (XC, 90)
     * (XCIII, 93)  (XCV, 95)  (XCVIII, 98)  (XCIX, 99)
     *
     * 百位数举例
     * (C, 100)  (CC, 200)  (CCC, 300)  (CD, 400)  (D, 500)  (DC, 600)  (DCC, 700)
     * (DCCC, 800)  (CM, 900)  (CMXCIX, 999)
     *
     * 千位数举例
     * (M, 1000)  (MC, 1100)  (MCD, 1400)  (MD, 1500)  (MDC, 1600)  (MDCLXVI, 1666)
     * (MDCCCLXXXVIII, 1888)  (MDCCCXCIX, 1899)  (MCM, 1900)  (MCMLXXVI, 1976)
     * (MCMLXXXIV, 1984)  (MCMXC, 1990)  (MM, 2000)  (MMMCMXCIX, 3999)
     *
     * 题目大意:
     * 输入一个数字,将它转成一个罗马数字,输入的数字在[1, 3999]之间
     *
     * </pre>
     *
     * @param num
     * @return
     */
    public String intToRoman(int num) {

        String[][] base = new String[][]{
                {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}, // 个位的表示
                {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, // 十位的表示
                {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, // 百倍的表示
                {"M", "MM", "MMM", "", "", "", "", "", ""}}; // 千位的表示


        String result = "";

        // 每除一次就示处理后一个数位(从小到大)
        // i记录当前处理的是第几个数位
        for (int i = 0; num != 0; num /= 10, i++) {
            // 如果不为0,说明这个数位上有值,要进行相加操作
            if (num % 10 != 0) {
                // 拼接结果
                result = base[i][num % 10 - 1] + result;
            }
        }

        return result;
    }
}

三、总结

    我们可能被题目所迷惑,导致自己没有解决办法,可是如果将这些东西写出来,一些都是那样的简单了。

原文地址:https://www.cnblogs.com/zyrblog/p/10213371.html