标签:div 数字 action man 一个 instead nbsp different str
Roman numerals are represented by seven different symbols: I
, V
, X
, L
, C
, D
and M
.
Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000
For example, two is written as II
in Roman numeral, just two one‘s added together. Twelve is written as, XII
, which is simply X
+ II
. The number twenty seven is written as XXVII
, which is XX
+ V
+ II
.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII
. Instead, the number four is written as IV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX
. There are six instances where subtraction is used:
I
can be placed before V
(5) and X
(10) to make 4 and 9. X
can be placed before L
(50) and C
(100) to make 40 and 90. C
can be placed before D
(500) and M
(1000) to make 400 and 900.Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: 3 Output: "III"
Example 2:
Input: 4 Output: "IV"
Example 3:
Input: 9 Output: "IX"
Example 4:
Input: 58 Output: "LVIII" Explanation: L = 50, V = 5, III = 3.
Example 5:
Input: 1994 Output: "MCMXCIV" Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
题目要转换阿拉伯数字和罗马数字,观察到题目内输入范围较小,在4位数以内,可以直接给出各位映射
class Solution { public String intToRoman(int num) { String[] v1= {"", "M", "MM", "MMM"}; String[] v2= {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; String[] v3= {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; String[] v4= {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; return v1[num / 1000] + v2[(num % 1000) / 100] + v3[(num % 100) / 10] + v4[num % 10]; } }
上面的方法有点取巧,我们来看看正常的做法
字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000
假设字符串S=abcd,我们要求出每一位的表示方式,依次要除以1000,100,10,中间要夹杂着500,50,5之类的,所以我们循环的时候每次要+2
除下来的结果我们无非是{0,1,2,3,4,5,6,7,8,9},根据题目意思,4和9是比较特殊的情况,我们可以把结果集分为x<4,x==4,x>4&&x<9,x==9
x<4的情况下,x>1才会有转换,并且x是多少就重复几次,可以用for(int i=1;i<4;i++)这里i必须要从1开始
x==4的情况下,分两部分加起来,一个5一个1就行了
x>4&&x<9的情况下,x>=5需要先把5的字符加上去,再从6开始循环,x>5就再往上加1,for(int i=6;i<=x;i++)
x==9的情况下,也是特殊情况,前一位和1加在一起
代码如下
class Solution { public String intToRoman(int num) { String res = ""; char roman[] = {‘M‘, ‘D‘, ‘C‘, ‘L‘, ‘X‘, ‘V‘, ‘I‘}; int value[] = {1000, 500, 100, 50, 10, 5, 1}; for (int n = 0; n < 7; n += 2) { int x= num/value[n]; if (x < 4) { for (int i = 1; i <= x; ++i) { res=res+roman[n]; } } else if (x == 4) { res=res+roman[n]+roman[n - 1]; } else if (x > 4 && x < 9) { res=res+roman[n - 1]; for (int i = 6; i <= x; ++i) { res=res+roman[n]; } } else if (x == 9) { res =res+roman[n]+roman[n - 2]; } num=num%value[n]; } return res; } }
[LeetCode]12. Integer to Roman整数转罗马数字
标签:div 数字 action man 一个 instead nbsp different str
原文地址:https://www.cnblogs.com/jchen104/p/10205576.html