12. 整数转罗马数字
摘要: 通常情况下,罗马数字中小的数字在大的数字的右边。给定一个整数,将其转为罗马数字。使用两个数组,一个是level数组:可以被代表的所有数值;另一个是romans数组:对应level中数值的罗马数字字符串。时间复杂度为O(1),输入的数字长度总是常数个,本题最多就是4次,空间复杂度为O(1)。
一、题目
罗马数字包含以下七种字符: 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。这个特殊的规则只适用于以下六种情况:
给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
点击查看原题
二、思路
对于该转换规则,需要明白,先让尽可能大的进行表示,才表示剩余部分的数字内容罗马数字2,比如,2099先表示2000,再表示90,最后才是9。那么该题就很简单了,暴力的话,直接几种情况就几种if else,一路下来即可。
可是问题没有这么简单,如果后续有需要增添规则情况下,那就比较麻烦了,因为代码耦合度太高,不利于后期修改。
数组存储的方法
使用两个数组,一个是level数组:可以被代表的所有数值;另一个是romans数组:对应level中数值的罗马数字字符串。
然后通过遍历数组并添加在答案中即可,这种方案如果将数组改为读文件罗马数字2,可以在后期扩展更多规则,降低了耦合度。
三、代码 数组存储的方法
class Solution {
public String intToRoman(int num) {
int[] level = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
StringBuilder ans = new StringBuilder();
for (int i = 0; i < level.length; i++) {
int t = num/level[i];
num %= level[i];
while (t-- > 0) {
ans.append(romans[i]);
}
}
return ans.toString();
}
}
时间复杂度为O(1),输入的数字长度总是常数个,本题最多就是4次,空间复杂度为O(1)。
tags: 罗马数字
我来说两句