菜鸡每日一题系列打卡12天
每天一道算法题目
小伙伴们一起留言打卡
坚持就是胜利,我们一起努力!
题目描述(引自LeetCode)
罗马数字包含以下七种字符: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.
题目分析
本题是一道情况可以穷举的题目,可以利用二维数组,或者哈希表,又或者两个一维数组将可能情况存储起来,然后针对数字的每一位进行相应的取值即可。本文采用二维数组进行可能情况的存储。
代码实现
class Solution {
public String intToRoman(int num) {
// 异常情况判断
if (num > 3999 || num < 1) {
throw new IllegalArgumentException("no solution!");
}
// roman的情况枚举
String[][] romans = {{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
{"", "M", "MM", "MMM"}};
StringBuilder builder = new StringBuilder();
builder.append(romans[3][num / 1000]).append(romans[2][num % 1000 / 100]).append(romans[1][num % 100 / 10]).append(romans[0][num % 10]);
return builder.toString();
}
}
代码分析
对代码进行分析,算法的时间复杂度为O(1),而空间也仅仅使用了固定的几个变量,因此,空间复杂度为O(1)。
执行结果
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到