• Leetcode:integer_to_roman


    一、     题目

       将给定的数字(阿拉伯数字)转化成罗马数字。

    数字不会大于3999

    二、     分析

       首先我们要知道神马是罗马数字,尽管听说过。但事实上我还真没有记住,于是就google了下,具体见下:

    个位数举例

    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.     首先。我们要先确定高位即千位的数字,即推断到底是1000还是2000还是3000。于是能够想到每次将num减去1000。并加上一个”M”。

    2.     然后,我们推断百位的数字。即能够用num/100来得到百位的数字

    3.     再次就是十位和个位,同2的做法

    将每个位的字母从左到右连接在一起即构成了我们的结果。

    另外,在CSDN上看到一个童鞋的方法非常好

    I = 1;

    V = 5;

    X = 10;

    L = 50;

    C = 100;

    D = 500;

    M = 1000;

    当中每两个阶段的之间有一个减法的表示,比方900=CM, C写在M前面表示M-C。范围给到3999,情况不多直接打表事实上更快。用代码推断表示预计比較繁琐。

    然后就是贪心的做法,每次选择能表示的最大值,把相应的字符串连起来。


    class Solution {
    public:
        string intToRoman(int num) {
            string str;
    		char *hu[] = {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
    		char *te[] = {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
    		char *on[] = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
    		
    		while(num>=1000) {
    			str+="M";
    			num-=1000;
    		}
    		str += hu[num/100];
    		num=num%100;
    		str += te[num/10];
    		num=num%10;
    		str+=on[num];
    		return str; 
        }
    };
    
    法2:
    class Solution {
    public:
        string intToRoman(int num) {
            string str;  
            string symbol[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};  
            int value[]=    {1000,900,500,400, 100, 90,  50, 40,  10, 9,   5,  4,   1}; 
            for(int i=0;num!=0;++i)
            {
                while(num>=value[i])
                {
                    num-=value[i];
                    str+=symbol[i];
                }
            }
            return str;
        }
    }; 
    
    法3:JAVA
    class Solution {
    public:
        string intToRoman(int num) {
            int[] values = {1000, 900, 500, 400, 100,90, 50, 40, 10, 9, 5, 4, 1 };
            String[] numerals = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
            StringBuilder result = new StringBuilder();
            for (int i = 0; i < values.length; i++) {
                while (number >= values[i]) {
                    number -= values[i];
                    result.append(numerals[i]);
                }
            }
            return result.toString();
        }
    };
    


  • 相关阅读:
    Blur Detection using OpenCV (Laplacian and FFT based approach)
    iBlurDetect: Image Blur Detection Techniques Assessment and Evaluation Study
    Cassandra
    ClickHouse
    xarray 生成 tiff 文件
    PostgreSQL 安装与使用
    PostgreSql和PostGIS安装——Windows10家庭版
    python 安装geopandas
    Linux从基础到架构师学习路线 摩天居士
    10 Python编程:从入门到实践socket&socketserver 摩天居士
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7261294.html
Copyright © 2020-2023  润新知