You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的LeetCode 12整数转罗马数字解法为何失效?存在无限循环问题

问题分析与修复:整数转罗马数字函数的错误与无限循环

核心问题拆解

1. 错误返回值的根源

原findNextDigit函数的逻辑完全偏离预期,无法正确匹配对应罗马数字的基数:

  • 以num=5为例:初始tmp=0、k=1,Math.pow(10,0)*1=1 <5进入循环,判断5-1=4不小于1,于是tmp自增到1。此时Math.pow(10,1)*1=10不满足<5的循环条件,直接返回10,对应罗马字符'X'——这就是小于10的数字返回'X'的原因。
  • 同理,10到100之间的数字会错误返回100,对应'C'。

2. 无限循环的触发原因

当你把代码中的tmp++改为tmp-=1时,tmp会持续递减,Math.pow(10,tmp)会变成0.1、0.01这类小于1的小数,乘以k后永远小于num(只要num≥1),循环条件永远成立,直接导致无限循环。

修复后的代码

直接抛弃原有的错误逻辑,改用更简洁可靠的从大到小匹配预定义基数的方案:

class Solution {
    public String intToRoman(int num) {
        StringBuilder ans = new StringBuilder();
        // 按数值从大到小排列所有罗马数字对应关系
        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"};
        
        int index = 0;
        while (num > 0) {
            // 找到第一个不大于当前num的基数
            while (values[index] > num) {
                index++;
            }
            ans.append(symbols[index]);
            num -= values[index];
        }
        return ans.toString();
    }
}

修复说明

  • 用有序数组替代HashMap,从大到小遍历避免了复杂的浮点运算和逻辑判断,彻底解决精度问题
  • 每次取最大的可用罗马数字基数,拼接后减去对应数值,逻辑清晰直接
  • 改用StringBuilder拼接字符串,比直接用+=更高效

内容的提问来源于stack exchange,提问作者Dean Loyals

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:26:02