乘风破浪: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; } }
三、总结
我们可能被题目所迷惑,导致自己没有解决办法,可是如果将这些东西写出来,一些都是那样的简单了。