LeetCode 第12题:整数转罗马数字

本文详细介绍了LeetCode第12题的解决方案,讲解了将整数转换为罗马数字的算法思路,包括罗马数字的规则、匹配过程、特殊规则以及Java代码实现,并通过实例进行了演示。
摘要由CSDN通过智能技术生成

本文我们来讲解LeetCode 第12题:整数转罗马数字 —— 详解与实现。

引言

今天咱们要讨论的是LeetCode上的第12题——整数转罗马数字。这个题目看似简单,但实际上却充满了历史和文化的韵味。我们不仅要掌握算法,还能从中感受到古罗马人的智慧。接下来,我将带你一起揭开这个问题的神秘面纱。

题目描述

题目要求将一个给定的整数转换成罗马数字。罗马数字由七种符号组成:IVXLCDM。这些符号分别代表1,5,10,50,100,500 和 1000。罗马数字的规则如下:

  1. 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3。
  2. 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8。
  3. 小的数字(限于I、X和C)在大的数字的左边,所表示的数等于大数减小数得到的数,例如:IV = 4。

思路解析

罗马数字转化为整数的过程主要是根据罗马数字的规则进行分组和匹配。具体的步骤如下:

步骤详解

  1. 定义符号和值的对应关系
    我们需要一个数组来保存罗马数字的符号以及它们对应的整数值。
  2. 从大到小匹配
    我们从最大的符号开始匹配,尽量匹配大的符号,如果当前符号能够匹配上,就将对应的值累加到结果中,并减少相应的整数值。
  3. 特殊规则
    在匹配过程中,需要考虑罗马数字的特殊规则,即4、9、40、90、400、900等情况,这些需要用两个符号来表示的特殊情况。

动图演示

开始
定义罗马数字和对应整数的映射
从大到小匹配符号
累加对应值
整数值为0?
结束

代码实现

讲了这么多,咱们用Java代码实现一下:

public class Solution {
    public String intToRoman(int num) {
        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"};
        
        StringBuilder roman = new StringBuilder();
        
        for (int i = 0; i < values.length; i++) {
            while (num >= values[i]) {
                num -= values[i];
                roman.append(symbols[i]);
            }
        }
        
        return roman.toString();
    }
}

代码详解

我们逐行来看一下代码的实现逻辑:

  1. 定义罗马数字和对应整数的映射

    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"};
    
    • values 数组保存罗马数字对应的整数值,从大到小排列。
    • symbols 数组保存罗马数字符号,与 values 一一对应。
  2. 匹配和累加

    StringBuilder roman = new StringBuilder();
    
    for (int i = 0; i < values.length; i++) {
        while (num >= values[i]) {
            num -= values[i];
            roman.append(symbols[i]);
        }
    }
    
    • 使用 StringBuilder 来构建最终的罗马数字字符串。
    • 遍历 values 数组,从大到小匹配符号。
    • 如果当前整数值 num 大于等于当前 values[i],则减去 values[i],并将对应的 symbols[i] 添加到 roman 中。

举例说明

咱们用几个例子来看看这个算法是怎么工作的:

  1. 示例1

    • 输入:1994
    • 过程:
      • 初始:num = 1994
      • 匹配 Mnum 变为 1994 - 1000 = 994roman 变为 M
      • 匹配 CMnum 变为 994 - 900 = 94roman 变为 MCM
      • 匹配 XCnum 变为 94 - 90 = 4roman 变为 MCMXC
      • 匹配 IVnum 变为 4 - 4 = 0roman 变为 MCMXCIV
      • 最终得到罗马数字为 MCMXCIV
  2. 示例2

    • 输入:58
    • 过程:
      • 初始:num = 58
      • 匹配 Lnum 变为 58 - 50 = 8roman 变为 L
      • 匹配 Vnum 变为 8 - 5 = 3roman 变为 LV
      • 匹配 Inum 变为 3 - 1 = 2roman 变为 LVI
      • 匹配 Inum 变为 2 - 1 = 1roman 变为 LVII
      • 匹配 Inum 变为 1 - 1 = 0roman 变为 LVIII
      • 最终得到罗马数字为 LVIII
  3. 示例3

    • 输入:3999
    • 过程:
      • 初始:num = 3999
      • 匹配 Mnum 变为 3999 - 1000 = 2999roman 变为 M
      • 匹配 Mnum 变为 2999 - 1000 = 1999roman 变为 MM
      • 匹配 Mnum 变为 1999 - 1000 = 999roman 变为 MMM
      • 匹配 CMnum 变为 999 - 900 = 99roman 变为 MMMCM
      • 匹配 XCnum 变为 99 - 90 = 9roman 变为 MMMCMXC
      • 匹配 IXnum 变为 9 - 9 = 0roman 变为 MMMCMXCIX
      • 最终得到罗马数字为 MMMCMXCIX

总结

通过这个题目,我们了解了如何将整数转换为罗马数字。这个过程中,我们运用了贪心算法的思想,从最大值开始匹配,尽量匹配大的符号,这样可以减少计算步骤,提高效率。希望这篇博客能够帮助大家更好地理解和掌握这个题目。下次遇到类似的问题时,别忘了用这种贪心策略来试试看哦!

如果本文对您有所帮助的话,请收藏文章、关注作者、订阅专栏,感激不尽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gemini技术窝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值