LeetCode罗马数字转整数题使用if/else if方法结果错误原因求解
罗马数字转整数代码错误原因分析
你的代码存在以下几处核心错误,直接导致运行结果错误:
- 条件判断误用后置自增运算符
i++,特殊规则完全无法命中
你在双字符匹配逻辑中写的str[i]=='I' and str[i++]=='V'逻辑存在根本错误:后置i++会先返回i的当前值参与比较,再将i自增1。这意味着第二个判断的字符仍是当前str[i],而非你预期的下一位字符str[i+1],同时i会被意外提前+1,导致后续字符访问全部错位,所有特殊规则的条件永远不会触发。 substr方法调用无效,无法跳过已处理字符
C++中std::string的substr是只读接口,只会返回新生成的子串,不会修改原字符串本身。你写的str.substr(i+2)没有任何实际作用,原输入字符串不会变化,循环仍会按原有顺序遍历所有字符,不会跳过已经处理的双字符组合。- 缺少边界判断,存在数组越界风险
当循环变量i走到字符串最后一个位置时,访问下一位字符会超出字符串的合法索引范围,触发未定义行为,程序运行结果不可预期。 - 命中特殊规则后没有正确调整遍历步长
就算前面的问题修复,命中双字符的特殊规则后,你需要手动将i额外+1,否则下一轮循环会重复处理双字符组合的第二个字符,导致数值累加错误。
修正后参考代码
int romanToDecimal(string &str) { int num = 0; int n = str.size(); for(int i = 0; i < n; i++){ // 优先判断双字符特殊规则,先做边界判断避免越界 if(i < n-1 && str[i] == 'I' && str[i+1] == 'V'){ num += 4; i++; // 额外+1,跳过下一个已处理的字符 } else if(i < n-1 && str[i] == 'I' && str[i+1] == 'X'){ num += 9; i++; } else if(i < n-1 && str[i] == 'X' && str[i+1] == 'L'){ num += 40; i++; } else if(i < n-1 && str[i] == 'X' && str[i+1] == 'C'){ num += 90; i++; } else if(i < n-1 && str[i] == 'C' && str[i+1] == 'D'){ num += 400; i++; } else if(i < n-1 && str[i] == 'C' && str[i+1] == 'M'){ num += 900; i++; } else if(str[i] == 'I'){ num += 1; } else if(str[i] == 'V'){ num += 5; } else if(str[i] == 'X'){ num += 10; } else if(str[i] == 'L'){ num += 50; } else if(str[i] == 'C'){ num += 100; } else if(str[i] == 'D'){ num += 500; } else if(str[i] == 'M'){ num += 1000; } } return num; }
内容的提问来源于stack exchange,提问作者fuzzy_developer
相关产品推荐
相关产品推荐

