首页 > 解决方案 > for in 不减,但 for 减

问题描述

我在 leetcode 上发现了一个我想解决的问题,for in而不是if关于将罗马数转换为自然数:

let s = "IV"
let res = 0
let dic = {
  M: 1000,
  D: 500,
  C: 100,
  L: 50,
  X: 10, 
  V: 5,
  I: 1
}

设置基本变量后,我编写了实际代码:

for (let i in s) {
  if (dic[s[i]] < dic[s[i + 1]]) {
    res -= dic[s[i]];
  } else {
    res += dic[s[i]];
  }
}

这样做的结果是 6 而不是 4,这让我感到惊讶,如果我们采用i = 0,我们就有了,if (1 < 5) {res -= 1}那么什么时候i = 1将 5 添加到 -1 所以结果应该是 4。

在尝试之后,我找到了一种完全像我一样的方法,但是使用for (let i = 0; i < s.length; i++)并且有效。

我的问题是为什么它适用于另一种类型的for? 有没有办法做到这一点,for in因为它更具可读性?

标签: javascriptarraysfor-loopfor-in-loop

解决方案


i是一个字符串。所以像这样使用parseInt它:

let s = "IV"
let res = 0
let dic = {
  M: 1000,
  D: 500,
  C: 100,
  L: 50,
  X: 10, 
  V: 5,
  I: 1
}
for (let i in s.split("")) {
  if (dic[s[i]] < (dic[s[parseInt(i)+1]])) {
    res -= dic[s[i]];
  } else {
    res += dic[s[i]];
  }
}
console.log("res",res);


推荐阅读