-
Notifications
You must be signed in to change notification settings - Fork 0
/
M 12. Integer to Roman
72 lines (60 loc) · 3.86 KB
/
M 12. Integer to Roman
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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, 2 is written as II in Roman numeral, just two one's added together. 12 is written as XII, which is simply X + II. The number 27 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.
题目翻译:罗马数字由七个不同的符号表示: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。
罗马数字通常从左到右按从大到小的顺序书写。但是,表示四的数字不是 IIII。相反,数字 4 书写为 IV。因为 1 在 5 之前,我们将其减去,得到 4。同样的原则适用于数字 9,书写为 IX。有六个减法使用的实例:
I 可以放在 V(5)和 X(10)之前,表示 4 和 9。
X 可以放在 L(50)和 C(100)之前,表示 40 和 90。
C 可以放在 D(500)和 M(1000)之前,表示 400 和 900。
给定一个整数,将其转换为罗马数字。
best answer
class Solution {
// 定义罗马数字的数值数组
private static final int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
// 定义对应的罗马数字符号数组
private static final String[] symbols = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
// 定义将整数转换为罗马数字的方法
public String intToRoman(int num) {
// 初始化一个 StringBuilder 用于存储转换后的罗马数字
StringBuilder sb = new StringBuilder();
// 遍历 values 数组,如果 num 变为 0,则停止遍历
for (int i = 0; i < values.length && num > 0; i++) {
// 当 values[i] 小于等于 num 时,循环执行
while (values[i] <= num) {
// num 减去当前遍历到的数值
num -= values[i];
// 将对应的罗马数字符号追加到 StringBuilder 中
sb.append(symbols[i]);
}
}
// 返回转换后的罗马数字字符串
return sb.toString();
}
}
从算法层面讲解这道题:
首先,我们创建了两个数组,一个用于存储罗马数字的数值,一个用于存储对应的符号。这两个数组是按照从大到小的顺序排列的。
我们初始化一个 StringBuilder 对象,用于存储转换后的罗马数字字符串。
使用一个 for 循环遍历 values 数组。在循环体内,我们使用一个 while 循环来判断当前遍历到的 values[i] 是否小于等于 num。如果是,则将 num 减去 values[i],并将对应的罗马数字符号追加到 StringBuilder 中。我们将继续执行此过程,直到 num 变为 0 或遍历完整个 values 数组。
最后,我们返回转换后的罗马数字字符串。
这个算法的关键在于逐个处理从大到小排列的 values 数组中的元素。当我们找到一个适合的数值时,我们将其从 num 中减去,并将对应的罗马数字符号追加到结果字符串中。这样,我们可以确保最终生成的罗马数字字符串符合题目的要求。