力扣第十二题——整数转罗马数字

avatar
作者
猴君
阅读量:3

内容介绍

七个不同的符号代表罗马数字,其值如下:

符号
I1
V5
X10
L50
C100
D500
M1000

罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:

  • 如果该值不是以 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 的次方(IXCM)最多可以连续附加 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的罗马数字形式。

方法实现
  1. 创建一个StringBuffer对象roman,用于构建最终的罗马数字字符串。
  2. 使用一个for循环遍历values数组,同时通过索引访问symbols数组。
  3. 在循环内部,定义两个变量valuesymbol,分别表示当前罗马数字的数值和符号。
  4. 使用while循环判断num是否大于等于当前的value。如果是,则从num中减去value,并将symbol追加到roman中。
  5. 如果num减到0,表示已经完成了所有数值的转换,使用break跳出循环。
  6. 循环结束后,调用roman.toString()方法返回构建好的罗马数字字符串。

示例分析

假设调用intToRoman(1954),以下是转换过程:

  1. num为1954,大于values[0](1000),所以减去1000,roman变为"M",num变为954。
  2. num为954,大于values[2](500),所以减去500,roman变为"MD",num变为454。
  3. num为454,大于values[6](50),所以减去50,roman变为"MDL",num变为404。
  4. num为404,大于values[8](400),所以减去400,roman变为"MDXL",num变为4。
  5. num为4,等于values[11](4),所以减去4,roman变为"MDXLIV",num变为0。
  6. 循环结束,返回"MDXLIV",这是1954的罗马数字表示。

知识点精炼

  1. 组合规则

    • 如果较小的数字在较大的数字前面,表示这两个数字的差值(如IV表示4,IX表示9)。
    • 如果较小的数字在较大的数字后面,表示这两个数字的和(如VI表示6,XI表示11)。
  2. 算法思路

    • 创建两个数组,分别存储罗马数字的数值和对应符号。
    • 从大到小遍历数值数组,将整数转换为罗马数字。
  3. 关键步骤

    • 使用循环和条件判断,逐步减去当前最大的罗马数字数值,并拼接对应的符号。
    • 当整数减到0时,结束循环。
  4. 优化技巧

    • 使用StringBufferStringBuilder进行字符串拼接,提高效率。
    • 在循环中判断整数是否为0,及时跳出循环,避免不必要的计算。
  5. 注意事项

    • 确保数值数组和符号数组的顺序一致。
    • 处理整数时,注意边界条件,如0的处理。

 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!