我的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
相关产品推荐
相关产品推荐

