zoukankan      html  css  js  c++  java
  • 【LeetCode】12. 整数转罗马数字

    来源

    https://leetcode-cn.com/problems/integer-to-roman

    描述

    罗马数字包含以下七种字符: 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.

    题解:贪心算法

    这道题类似于生活中找零钱的问题,于是考虑用贪心算法。

    罗马数字和阿拉伯数字的对应关系如下:

    罗马数字 阿拉伯数字
    I 1
    V 5
    X 10
    L 50
    C 100
    D 500
    M 1000

    另外,还有一些特例:

    罗马数字 阿拉伯数字
    IV 4
    IX 9
    XL 40
    XC 90
    CD 400
    CM 900

    将上面两个表合并为一个表,按照数字从大到小的顺序排列。
    然后,对于给定的数字,就可以依次减去合适它的最大数字,将对应的罗马数字添加到输出字符串上。
    这样,直到数字为0,就完成了转换。

    C++

    展开后查看
    class Solution {
    public:
        string intToRoman(int num) {
            string result;
            int values[] = {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"};
            for(int i = 0; i < 13; i++){
                while(num >= values[i]){
                    num -= values[i];
                    result += romans[i];
                }
            }
            return result;
        }
    };
    

    Java

    展开后查看
    class Solution {
        public String intToRoman(int num) {
            StringBuilder result = new StringBuilder();
            int values[] = {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"};
            for(int i = 0; i < values.length; i++){
                while(num >= values[i]){
                    num -= values[i];
                    result.append(romans[i]);
                }
            }
            return result.toString();
        }
    }
    
  • 相关阅读:
    JavaScript快速入门-DOM对象
    JavaScript快速入门-ECMAScript对象介绍
    JavaScript快速入门-ECMAScript函数
    JavaScript快速入门-ECMAScript运算符
    [转] boost::function用法详解
    [转] [翻译]图解boost::bind
    [转] Git 分支
    [转] 多线程下变量-gcc原子操作 __sync_fetch_and_add等
    [转] Boost智能指针——scoped_ptr
    [转] linux下的c/c++调试器gdb
  • 原文地址:https://www.cnblogs.com/crazyBlogs/p/13139100.html
Copyright © 2011-2022 走看看