c++ - 我的“罗马数字到整数”代码错误
问题描述
有人能告诉我为什么我的代码不工作并给出错误的输出吗?我认为逻辑是正确的,所以我不确定我犯了哪些错误。谢谢
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();i++)
{
if(map[s[i]]>=map[s[i+1]])
result+=map[s[i]];
else
result+=(map[s[i+1]]-map[s[i]]);
}
return result;
}
测试用例
Input: "IV"
Output: 9
Expected: 4
解决方案
您的代码有问题的是您正在比较字符的 ASCII 值而不是它们的数值。此外,您不应该添加map[s[i+1]]
,因为您将添加该值两次(一次在 stepi
和 step i + 1
)。此外,您应该更加小心s[i+1]
,因为索引可能超出范围。所以首先,检查索引是否为 n - 1 (最后一个字符)。
这是我的方法:
int from_roman(string roman) {
map<char,int> values={{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};
int i,n=roman.length(),val=0;
for(i=0;i<n;i++)
{
if(i==n-1||values[roman[i]]>=values[roman[i+1]])
val+=values[roman[i]];
else
val-=values[roman[i]];
}
return val;
}
或者如果您愿意,可以使用更紧凑的版本:
int from_roman(string roman) {
map<char,int> values={{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};
int i,n=roman.length(),val=0;
for(i=0;i<n;i++)val+=(i==n-1||values[roman[i]]>=values[roman[i+1]]?1:-1)*values[roman[i]];
return val;
}
推荐阅读
- javascript - GET XMLHttpRequest 在就绪状态 4 和状态 0 处停止
- c++ - 使用-xipo -xO4构建时发生c ++崩溃
- julia - 从图灵模型绘制 Julia 中的可信区间
- python - 将值设置为变量的单行 lambda 函数
- powershell - 从命令行从几个大型压缩文件夹中解压缩文件
- python - 如何将相同的功能应用于多个列表
- flutter - 如何使用 SharedPreferences 保存列表?
- javascript - 如何检测旋转的矩形何时相互碰撞
- javascript - DataTables 子行 IE 和 Edge 混淆错误
- python - Python查找轮廓并绘制轮廓函数错误