【问题标题】:JavaScript - Take A Ten Minute Walk - How to Access Array Elements ProperlyJavaScript - 走十分钟 - 如何正确访问数组元素
【发布时间】:2019-08-17 06:07:22
【问题描述】:

如果您不熟悉此挑战,请参阅以下说明:

https://www.codewars.com/kata/54da539698b8a2ad76000228/train/javascript

您住在笛卡尔市,所有道路都以完美的网格布局。你提前十分钟到了约会,所以你决定借此机会去散散步。这座城市在他们的手机上为市民提供了一个步行生成应用程序——每次你按下按钮时,它都会向你发送一组代表步行方向的单字母字符串(例如 ['n'、's'、'w'、 'e'])。你总是在一个方向上只走一个街区,而且你知道穿过一个街区需要一分钟,所以创建一个返回 true 的函数,如果应用程序给你的步行将花费你正好十分钟(你不需要想早点或晚点!),当然,会让你回到起点。否则返回 false。

到目前为止,我已经尝试过:

function isValidWalk(walk) {

  //initiate person starting point
  let person = [0, 0]
  //establish what the ending point must be
  let finalDestination = [0, 0]

  let north = [0, 1]
  let east = [1, 0]
  let south = [0, -1]
  let west = [-1, 0]

  //as long as the length of the array is 10 or less, continue walk
  for (let i = 0; i <= 10; i++) {
    //if the letter in the array is "n", move north
    if (walk[i] === "n") {
      person + north;
    }
    //if the letter in the array is "e", move east
    if (walk[i] === "e") {
      person + east;
    }
    //if the letter in the array is "s", move south
    if (walk[i] === "s") {
      person + south;
    }
    //if the letter in the array is "w", move west
    if (walk[i] === "w") {
      person + west;
    }
  }

  if (person === finalDestination) {
    return true;
  }
  else {
    return false;
  }

}

这是通过了 6/9 的测试,但它没有返回 true 进行有效的步行。

如您所见,我试图说如果person 的位置等于他们步行结束时的finalDestination 变量,则isValidWalk 函数应该返回true。

我知道可能还有其他方法可以解决此问题,但如果可能的话,我想继续遵循我已建立的逻辑。

我想知道我的问题是否是我没有正确访问数组中的元素? IE。 walk[i] 在这里正确获取数组元素吗?

    if (walk[i] === "n") {
      person + north;
    }

这就是应该在这个假想的网格上移动person 的原因,但显然它没有做任何事情。我应该尝试访问数组中的元素并检查它们是否等于“n”、“e”、“s”和“w”的其他语法?

【问题讨论】:

  • 他们没有说笛卡尔位于哪个表面上,但假设它是一个平面,则无需操作坐标,只需确保字符串具有相同数量的“n”和“s”和“e”和“w”。

标签: javascript arrays function for-loop


【解决方案1】:

首先,JavaScript 数组不像数学矩阵那样工作。 array1 + array2 不会将这些数组中的各个值加在一起。相反,您必须增加/减少数组中的值:

if (walk[i] === "n") {
  person[0]++;
}
if (walk[i] === "e") {
  person[1]++;
}
if (walk[i] === "s") {
  person[0]--;
}
if (walk[i] === "w") {
  person[1]--;
}

或者更简洁:

switch(walk[i]) {
  case "n": person[0]++; break;
  case "e": person[1]++; break;
  case "s": person[0]--; break;
  case "w": person[1]--; break;
}

其次,personfinalDestination 是数组,所以=== 表示引用 相等。也就是说,person === finalDestination 只会在两个变量都指向内存中的相同位置时返回 true。相反,您需要比较数组的各个值,例如

if (person[0] === finalDestination[0] &&
    person[1] === finalDestination[1]) {
  return true;
}
else {
  return false;
}

或者更简洁:

return person[0] === finalDestination[0] &&
       person[1] === finalDestination[1];

但是,请注意 finalDestination 永远不会改变,因此您甚至根本不需要该变量。您可以将其替换为:

return person[0] === 0 && person[1] === 0;

关于要求的最后一点:

返回true 如果应用程序提供的步行将带您整整十分钟

您需要将此添加到函数的顶部:

if (walk.length !== 10) return false;

对于更简洁的代码,通过将i &lt;= 10 替换为i &lt; 10i &lt; walk.length,确保您的for-loop 不会超过walk 的末尾。

【讨论】:

  • 我认为建立这些变量 - northsoutheastwest - 基本上没有意义?
  • @HappyHands31 在这种情况下它们不是必需的。如果您想表示更复杂的方向(例如对角线或国际象棋中马的移动),那么实现一种向量/矩阵数学可能是值得的。
  • @HappyHands31 不是真的,我称之为干净的代码,如果它变得更复杂(更多方向、对角线等),这种模式可能会让你走得更远
  • 是的,当步行不到十分钟时,我仍然收到错误消息。感谢您解决这个问题,以及您关于将 &lt;= 更改为 &lt; 的观点 - 谢谢。
【解决方案2】:

您不能只添加数组。如果你这样做,它们将被转换为一个字符串,而且你不会将结果存储在某处:

[0, 1] + [0, 0]
// equals
"0,1" + "0,0"

您必须将它们逐个值相加:

person[0] += west[0];
person[1] += west[1];

在此处通过引用另外比较数组:

 if (person === finalDestination) {

只有在你愿意 person = finalDestination 时才会成立。您可能想再次逐个比较它们:

 if(person[0] === finalDestination[0] && person[1] ===  finalDestination[1])

也就是说,虽然这可行,但还有更简单的解决方案(提示:分而治之:N/S 和 W/E),如果你解决了 Kata,你会看到:)

这是通过 6/9 测试

错误的时钟一天也正确两次。如果你愿意:

 return Math.random() > 0.5;

平均尝试 500 次后它也可以工作。

我的观点是:通过的测试用例数量并不能真正表明您的解决方案有多错误,只是对下一个 Kata 的小提示。

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 2013-04-06
    • 2016-02-19
    • 1970-01-01
    • 2012-08-08
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多