leetcode:12.整数转罗马数字

简介: 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

题目描述:


罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。


字符          数值
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 。


通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 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。


给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。


示例:


示例1:


输入: 3
输出: "III"


示例2:


输入: 4
输出: "IV"


示例3:


输入: 9
输出: "IX"


示例4:


输入: 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.


示例5:


输入: 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.


题目难度:中等


分析:


有一种比较投机取巧的办法就是把所有(类似:1、2、3、10、20、30、100、200、300)组合都列举出来,这样只需要确定位数然后拼接即可,如:1994 = 1000 + 900 + 90 + 4。然后确定1000的罗马数字,900的罗马数字,以此类推。


代码如下:


class Solution {
    public String intToRoman(int num) {
      // 限定1-3999范围
        if (num < 1 || num > 3999) {
            return "";
        }
        // 列举整数对应表
        Map<String, String> map = new HashMap<>();
        map.put("0", "");
        map.put("00", "");
        map.put("000", "");
        map.put("1", "I");
        map.put("2", "II");
        map.put("3", "III");
        map.put("4", "IV");
        map.put("5", "V");
        map.put("6", "VI");
        map.put("7", "VII");
        map.put("8", "VIII");
        map.put("9", "IX");
        map.put("10", "X");
        map.put("20", "XX");
        map.put("30", "XXX");
        map.put("40", "XL");
        map.put("50", "L");
        map.put("60", "LX");
        map.put("70", "LXX");
        map.put("80", "LXXX");
        map.put("90", "XC");
        map.put("100", "C");
        map.put("200", "CC");
        map.put("300", "CCC");
        map.put("400", "CD");
        map.put("500", "D");
        map.put("600", "DC");
        map.put("700", "DCC");
        map.put("800", "DCCC");
        map.put("900", "CM");
        map.put("1000", "M");
        map.put("2000", "MM");
        map.put("3000", "MMM");
    // 如果数字包含在map中直接return即可
        if (map.containsKey(num+"")) {
            return map.get(num+"");
        }
        StringBuilder sb = new StringBuilder();
        // 判断整数在哪个区间
        if (num > 1000) {
          // 确定区间以后首先判断首位(从左到右)然后依次确定每位的数字即可
            int temp = num / 1000;
            sb.append(map.get(temp + "000"));
            num %= 1000;
            temp = num / 100;
            sb.append(map.get(temp + "00"));
            num %= 100;
            temp = num / 10;
            sb.append(map.get(temp + "0"));
            num %= 10;
            sb.append(map.get(num + ""));
        } else if (num > 100) {
            int temp = num / 100;
            sb.append(map.get(temp + "00"));
            num %= 100;
            temp = num / 10;
            sb.append(map.get(temp + "0"));
            num %= 10;
            sb.append(map.get(num + ""));
        } else {
            int temp = num / 10;
            sb.append(map.get(temp + "0"));
            num %= 10;
            sb.append(map.get(num + ""));
        }
        return sb.toString();
    }
}


总结:


时间复杂度为O ( l o g 10 n ) 方法很简单,不过效率也还可以。如果整数对应的罗马数字太多,就不能一一列举了,在较少的情况下,可以穷举出结果。当然也有更好的办法,可以参考排名或评论区。

目录
相关文章
|
1天前
|
算法
力扣经典150题第十八题:整数转罗马数字
力扣经典150题第十八题:整数转罗马数字
4 0
|
1天前
|
存储 算法 测试技术
力扣经典150题第十七题:罗马数字转整数
力扣经典150题第十七题:罗马数字转整数
5 0
|
20天前
|
SQL 算法 数据挖掘
深入探索力扣第12题:整数转罗马数字的算法之旅
深入探索力扣第12题:整数转罗马数字的算法之旅
|
20天前
|
SQL 算法 数据可视化
LeetCode第八题:字符串转换整数 (atoi)【8/1000 python】
LeetCode第八题:字符串转换整数 (atoi)【8/1000 python】
|
1月前
leetcode代码记录(整数拆分
leetcode代码记录(整数拆分
21 0
|
15天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
15天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
16天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
16天前
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
|
16天前
|
算法 容器
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词