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

内容介绍

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

符号
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 的次方(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的处理。

 

相关推荐

  1. ——整数罗马数字

    2024-07-19 01:58:01       22 阅读
  2. 经典150整数罗马数字

    2024-07-19 01:58:01       40 阅读
  3. 13-罗马数字整数[简单]

    2024-07-19 01:58:01       60 阅读
  4. ——整数

    2024-07-19 01:58:01       23 阅读
  5. 题目学习笔记(OC + Swift) 13. 罗马数字整数

    2024-07-19 01:58:01       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 01:58:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 01:58:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 01:58:01       58 阅读
  4. Python语言-面向对象

    2024-07-19 01:58:01       69 阅读

热门阅读

  1. Qt 实战(6)事件 | 6.3、自定义事件

    2024-07-19 01:58:01       25 阅读
  2. 数据库(Database,简称DB)介绍

    2024-07-19 01:58:01       20 阅读
  3. x264、x265、libaom 编码对比实验

    2024-07-19 01:58:01       21 阅读
  4. Bootstrap apexLine后端数据与前端Asp.net MVC数据交互

    2024-07-19 01:58:01       21 阅读
  5. DW1000在STM32环境下实现定位功能

    2024-07-19 01:58:01       22 阅读
  6. Vue3快速入门1

    2024-07-19 01:58:01       22 阅读
  7. 微信小程序:3.页面开发

    2024-07-19 01:58:01       21 阅读
  8. MySQL简介

    2024-07-19 01:58:01       19 阅读
  9. Vue + litegraph.js 实现蓝图功能

    2024-07-19 01:58:01       25 阅读
  10. c语言(函数7.18)

    2024-07-19 01:58:01       24 阅读
  11. RK3568 linux-5.10 rk809 声卡实现spk hp自动切换

    2024-07-19 01:58:01       22 阅读
  12. 蜣螂算法(BSO)及Python和MATLAB实现

    2024-07-19 01:58:01       21 阅读
  13. A. Little Nikita

    2024-07-19 01:58:01       20 阅读
  14. Ubuntu22,ROS2 colcon/cmake 编译卡死问题解决

    2024-07-19 01:58:01       20 阅读