[Leetcode] Interger to roman 整数转成罗马数字

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

题意:将整数转换成罗马数字,这里就需要对什么是罗马数字有一些了解。一下部分摘选于百度百科

计数方法:

1)相同的数字连写,所表示的数等于这些数字相加得到的数,如:III=3;

2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如:VIII=8、XII=12;

3)小的数字(限于I、X、和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:IV=4、IX=9;

4)正常使用时,连写的数字重复不得超过三次;

5)在一个数的上面画一条横线,表示这个数扩大1000倍。

组数规则:

1)基本数字I、X、C中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能一个;

2)不能把基本数字V、L、D中的任何一个座位小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目只能用一个;

3)V和X的左边的小数子只能用I;

4)L和C的左边小数字只能用X;

5)D和M左边的小数字只能用C;

规则3~5可以理解为,放在左边的小数字只能是同一级别,额,好吧,具体含义得自己体会。

方法一:题中给出了整数的范围, 用罗马数字给出各个数字对应的表现形式,用二维向量表示。值得注意的是 “” 的位置,求罗马数字的过程可以表示为从个位、十位、百位、千位一步步的计算,在返回值res的求值中,+两段的顺序不能颠倒。代码如下:

 1 class Solution {
 2 public:
 3     string intToRoman(int num) 
 4     {
 5         vector<vector<string>> strR=
 6         {
 7             {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
 8             {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
 9             {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
10             {"", "M", "MM", "MMM"}
11         };
12 
13         string res="";
14         int row=0;
15         while(num !=0)
16         {
17             int col=num%10;
18             res=strR[row][col]+res;  //注意顺序
19             row++;
20             num/=10;
21         }
22         return res;
23     }
24 };

 

方法二:参考Grandyang的博客,使用贪婪算法的解法。建立表格,每次通过查找当前最大的数,减去在查找。和上面解法的区别在于,上面是将每个数量级上的整数一次性转成罗马数字,这个是有点像用天平秤东西一样,从大到小的一个个试。代码如下:

 1 class Solution {
 2 public:
 3     string intToRoman(int num) 
 4     {
 5         string res;
 6         vector<int> intVal{1000,900,500,400,100,90,50,40,10,9,5,4,1};
 7         vector<string> strRoman{"M","CM","D","CD","C","XC","L","XL","X",
 8         "IX","V","IV","I"};
 9 
10         for(int i=0;i<intVal.size();++i)
11         {
12             while(num>=intVal[i])
13             {
14                 num-=intVal[i];
15                 res+=strRoman[i];
16             }
17         }   
18         return res;
19     }
20 };
posted @ 2017-06-20 10:52  王大咩的图书馆  阅读(493)  评论(0编辑  收藏  举报