我的romanToInt罗马数字转整数代码输出错误,该如何排查?
问题原因
- 越界访问问题:遍历过程中直接读取
s[i+1],当i走到字符串最后一个下标s.size()-1时,i+1超出了字符串的合法访问范围,属于未定义行为。C++字符串末尾默认是\0,你使用的unordered_map用[]访问不存在的键时,会自动插入值为0的对应条目,所以最后一次判断会把越界读到的内容对应的值当做0处理。 - 累加逻辑重复:以你测试的输入
IV为例:
i=0时,判断I对应值1 < V对应值5,累加
5-1=4,此时result为4
i=1时,判断V对应值5 >= 越界读到的\0对应值0,累加5,最终result为9,和你得到的错误输出完全吻合
修复方案
调整逻辑为:如果当前字符值小于下一个字符值,就减去当前值,否则加上当前值,最后单独累加最后一个字符的值即可,修改后代码如下:
int romanToInt(string s) { unordered_map<char, int> map ={{'M',1000},{'D',500},{'C',100},{'L',50},{'X',10},{'V',5},{'I',1}}; int result = 0; // 循环只走到倒数第二个字符,避免越界 for(int i=0;i<s.size()-1;i++) { if(map[s[i]]>=map[s[i+1]]) result += map[s[i]]; else result -= map[s[i]]; } // 最后加上最后一个字符的值 result += map[s.back()]; return result; }
内容的提问来源于stack exchange,提问作者B_M
相关产品推荐
相关产品推荐

