阅读量:3
内容介绍
七个不同的符号代表罗马数字,其值如下:
符号 值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (
V
) 减 1 (I
):IV
,9 是 10 (X
) 减 1 (I
):IX
。仅使用以下减法形式:4 (IV
),9 (IX
),40 (XL
),90 (XC
),400 (CD
) 和 900 (CM
)。- 只有 10 的次方(
I
,X
,C
,M
)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V
),50 (L
) 或 500 (D
)。如果需要将符号附加4次,请使用 减法形式。给定一个整数,将其转换为罗马数字。
示例 1:
输入:num = 3749
输出: "MMMDCCXLIX"
解释:
3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M) 700 = DCC 由于 500 (D) + 100 (C) + 100 (C) 40 = XL 由于 50 (L) 减 10 (X) 9 = IX 由于 10 (X) 减 1 (I) 注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位示例 2:
输入:num = 58
输出:"LVIII"
解释:
50 = L 8 = VIII示例 3:
输入:num = 1994
输出:"MCMXCIV"
解释:
1000 = M 900 = CM 90 = XC 4 = IV提示:
1 <= num <= 3999
完整代码
class Solution { int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; public String intToRoman(int num) { StringBuffer roman = new StringBuffer(); for (int i = 0; i < values.length; ++i) { int value = values[i]; String symbol = symbols[i]; while (num >= value) { num -= value; roman.append(symbol); } if (num == 0) { break; } } return roman.toString(); } }
思路详解
代码概述
这段代码定义了一个名为Solution
的类,其中包含一个将整数转换为罗马数字的方法intToRoman
。罗马数字是一种使用拉丁字母来表示数值的系统,常用于古罗马时期。该方法接收一个整数num
作为参数,并返回对应的罗马数字字符串。
类成员变量
values
:一个整型数组,存储了罗马数字的基本数值,从大到小排列。symbols
:一个字符串数组,与values
数组中的数值一一对应,存储了相应的罗马数字符号。
这两个数组共同定义了罗马数字的编码规则,其中一些符号是由两个字母组合而成的,如"CM"(900)、“CD”(400)等,这些组合符号用于表示某些特定的数值。
intToRoman方法
方法签名
public String intToRoman(int num)
该方法接收一个整数num
,返回一个字符串,表示num
的罗马数字形式。
方法实现
- 创建一个
StringBuffer
对象roman
,用于构建最终的罗马数字字符串。 - 使用一个
for
循环遍历values
数组,同时通过索引访问symbols
数组。 - 在循环内部,定义两个变量
value
和symbol
,分别表示当前罗马数字的数值和符号。 - 使用
while
循环判断num
是否大于等于当前的value
。如果是,则从num
中减去value
,并将symbol
追加到roman
中。 - 如果
num
减到0,表示已经完成了所有数值的转换,使用break
跳出循环。 - 循环结束后,调用
roman.toString()
方法返回构建好的罗马数字字符串。
示例分析
假设调用intToRoman(1954)
,以下是转换过程:
num
为1954,大于values[0]
(1000),所以减去1000,roman
变为"M",num
变为954。num
为954,大于values[2]
(500),所以减去500,roman
变为"MD",num
变为454。num
为454,大于values[6]
(50),所以减去50,roman
变为"MDL",num
变为404。num
为404,大于values[8]
(400),所以减去400,roman
变为"MDXL",num
变为4。num
为4,等于values[11]
(4),所以减去4,roman
变为"MDXLIV",num
变为0。- 循环结束,返回"MDXLIV",这是1954的罗马数字表示。
知识点精炼
组合规则:
- 如果较小的数字在较大的数字前面,表示这两个数字的差值(如IV表示4,IX表示9)。
- 如果较小的数字在较大的数字后面,表示这两个数字的和(如VI表示6,XI表示11)。
算法思路:
- 创建两个数组,分别存储罗马数字的数值和对应符号。
- 从大到小遍历数值数组,将整数转换为罗马数字。
关键步骤:
- 使用循环和条件判断,逐步减去当前最大的罗马数字数值,并拼接对应的符号。
- 当整数减到0时,结束循环。
优化技巧:
- 使用
StringBuffer
或StringBuilder
进行字符串拼接,提高效率。 - 在循环中判断整数是否为0,及时跳出循环,避免不必要的计算。
- 使用
注意事项:
- 确保数值数组和符号数组的顺序一致。
- 处理整数时,注意边界条件,如0的处理。