• 12. Integer to Roman


    12. Integer to Roman

    题目

    • Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.
    • 首先要科普一下: 罗马数字
    ·个位数举例
    Ⅰ-1、Ⅱ-2、Ⅲ-3、Ⅳ-4、Ⅴ-5、Ⅵ-6、Ⅶ-7、Ⅷ-8、Ⅸ-9
    ·十位数举例
    Ⅹ-10、Ⅺ-11、Ⅻ-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
    

    解析

    • 思路一:将所有个十百千位的每一位都列举出来,直接取值即可
    • 思路二:其中每两个阶段的之间有一个减法的表示,比如900=CM, C写在M前面表示M-C。范围给到3999,感觉情况不多直接打表其实更快,用代码判断表示估计比较繁琐。然后就是贪心的做法,每次选择能表示的最大值,把对应的字符串连起来。

    I = 1;
    V = 5;
    X = 10;
    L = 50;
    C = 100;
    D = 500;
    M = 1000;

    class Solution_12 {
    public:
    	string intToRoman(int num) {
    		char* c[4][10] = {        //指针数组
    			{ "", "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 roman;
    		roman.append(c[3][num / 1000 % 10]);
    		roman.append(c[2][num / 100 % 10]);
    		roman.append(c[1][num / 10 % 10]);
    		roman.append(c[0][num % 10]);
    
    		return roman;
    	}
    
    	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;
    	}
    };
    
    
    

    题目来源

  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/8312738.html
Copyright © 2020-2023  润新知