题目
12. 整数转罗马数字
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II
,即为两个并列的 1。12 写做 XII
,即为 X
+ II
。 27 写做 XXVII
, 即为 XX
+ V
+ II
。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII
,而是 IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在V
(5) 和X
(10) 的左边,来表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左边,来表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左边,来表示 400 和 900。
给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
示例 1:
输入: 3
输出: “III”
示例 2:
输入: 4
输出: “IV”
示例 3:
输入: 9
输出: “IX”
示例 4:
输入: 58
输出: “LVIII”
解释: L = 50, V = 5, III = 3.
示例 5:
输入: 1994
输出: “MCMXCIV”
解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= num <= 3999
思路
这东西一看就是一一映射,怎么去做?当时使用Map了,关于阿拉伯数字的处理可以使用取余数的方式来做。
注意:4和9需要特殊处理,对于4,9本人不想做过多处理就直接放在map映射里面了
java代码
class Solution {
Map<Integer,String> map = new HashMap<>();
public String intToRoman(int num) {
StringBuffer result = new StringBuffer();
//添加映射规则,正常来说这玩意得放在外边
map.put(1,"I");
map.put(4,"IV");
map.put(5,"V");
map.put(9,"IX");
map.put(10,"X");
map.put(40,"XL");
map.put(50,"L");
map.put(90,"XC");
map.put(100,"C");
map.put(400,"CD");
map.put(500,"D");
map.put(900,"CM");
map.put(1000,"M");
//千
int thousandPlace = (num / 1000 % 10);
//百
int hundredPlace = (num / 100 % 10);
//十
int tenPlace = (num / 10 % 10);
//个
int unitPlace = num / 1 % 10;
StringBuffer thousand = getString(1000,thousandPlace);
StringBuffer hundred = getString(100,hundredPlace);
StringBuffer ten = getString(10,tenPlace);
StringBuffer unit = getString(1,unitPlace);
return result.append(thousand)
.append(hundred)
.append(ten)
.append(unit).toString();
}
private StringBuffer getString(int flag, int num) {
StringBuffer sb = new StringBuffer();
if(num == 4 || num == 9){
sb.append(map.get(num*flag));
}else if(num > 0 && num < 5){
for(int i = 1;i <= num;i++){
sb.append(map.get(flag));
}
}else if(num == 5){
sb.append(map.get(num*flag));
}else if (num > 5 ){
sb.append(map.get(5*flag));
for(int i =1;i <= num - 5;i++){
sb.append(map.get(flag));
}
}
return sb;
}
}