首页 > 代码库 > 【leetcode刷题笔记】Integer to Roman

【leetcode刷题笔记】Integer to Roman

Given an integer, convert it to a roman numeral.

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


 

题解:基本的罗马字符和数字对应如下表所示:

罗马字符数字
I1
V5
X10
L50
C100
D500
M1000

每隔一个字符又可以与相邻的两个字符组成一个新的数,例如I可以和V和X组成IV和IX,这样又可以生成6个数字,如下表:

罗马字符数字
IV4
IX9
XL40
XC90
CD400
CM900

接下来我们用numbers记录上述13个数字,symbol数组记录上述13个符号,然后从最大的数1000开始,一步步将num转换成数字。

数字3012的转换过程如下:

  1. 3012/1000 = 3,answer = MMM,num <- 3012-3000=12;
  2. 12/900=0; 12/500 = 0; ......
  3. 12/10 = 1, answer = MMM+X=MMMX, num <- 12 - 10 = 2;
  4. 2/9 = 0,; 2/5 = 0; 2/4 = 0;
  5. 2/1 = 2, answer = MMMX+II = MMMXII, num <- 2-2 = 0;

所以3012对应的罗马数字为MMMXII。

代码如下:

 1 public class Solution { 2     public String intToRoman(int num) { 3         if(num <= 0) 4             return ""; 5          6         int[] numbers = {1000,900,500,400,100,90,50,40,10,9,5,4,1}; 7         String[] symbol = {"M","CM","D","CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; 8          9         StringBuffer answer = new StringBuffer();10         int digit = 0;11         while(num > 0){12             int times = num / numbers[digit];13             for(int i = 0;i < times;i++)14                 answer.append(symbol[digit]);15             num = num - numbers[digit] * times;16             digit++;17         }18         return answer.toString();19     }20 }