/**
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
题目大意:把一个整数变成罗马数字,输入数字是1-3999
先恶补一下罗马数字相关知识:
最常见的罗马数字就是钟表的表盘符号:
I, II, III, IV(也作IIII), V, VI, VII, VIII, IX, X, XI, XII...
1、基本字符:
1-I,5-V,10-X,50-L,100-C,500-D,1000-M
2、基本规则:
a、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
b、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
c、小的数字,(限于I、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
d、正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外)
e、在一个数的上面画一条横线,表示这个数扩大1000倍。
3、注意事项:
a、基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
b、不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
c、V 和X 左边的小数字只能用Ⅰ。
d、L 和C 左边的小数字只能用X。
e、D 和M 左边的小数字只能用C。
4、举例:
a、个位数举例
Ⅰ,1 】Ⅱ,2】 Ⅲ,3】 Ⅳ,4 】Ⅴ,5 】Ⅵ,6】Ⅶ,7】 Ⅷ,8 】Ⅸ,9 】
b、十位数举例
Ⅹ,10】 Ⅺ,11 】ⅫII,13】 XIV,14】 XV,15 】XVI,16 】XVII,17 】XVIII,18】 XIX,19】 XX,20】 XXI,21 】XXII,22 】XX
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、百位数举例
C,100】 CC,200 】CCC,300 】CD,400】 D,500 】DC,600 】DCC,700】 DCCC,800 】CM,900】 CMXCIX,999】
d、千位数举例
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】
e、千位数以上
这个时候就要在字幕上面划横线了,纯字符没法表示
**/
public class Solution {
public String intToRoman(int num) {
//return solve1(num);
return solve2(num);
}
//============================ solve1 ================================
//直接预存储个、十、百、千位所有的值
//如果要说有什么可以改进的话,最后那里形成result的地方别用加号,用StringBuffer或者StringBuilder
private String solve1(int num){
String[] str3 = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
String[] str2 = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
String[] str1 = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
String[] str0 = {"", "M", "MM", "MMM"};
int num0 = num / 1000;
num %= 1000;
int num1 = num / 100;
num %= 100;
int num2 = num / 10;
num %= 10;
int num3 = num;
String result = str0[num0] + str1[num1] + str2[num2] + str3[num3];
return result;
}
//============================ solve2 ================================
//这是另外一种方式,我觉得这两个差不多
//不过使用的字符串少了一些,方法更巧妙了,同样可以使用用StringBuffer或者StringBuilder进行加速
private String solve2(int num){
String result = "";
String[] str = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int[] nums={1000,900,500,400,100,90,50,40,10,9,5,4,1};
int i = 0;
while(num != 0){
if(num >= nums[i]){
num -= nums[i];
result += str[i];
}else{
i++;
}
}
return result;
}
}
LeetCode:Integer to Roman
最新推荐文章于 2022-12-16 00:28:08 发布