【问题标题】:How to check if two numbers are sequential in JS? Codewars Kata如何检查JS中的两个数字是否连续? Codewars 卡塔
【发布时间】:2021-12-28 03:55:20
【问题描述】:

我正在尝试解决这个 kata:

给你一个唯一整数 arr 的列表,以及两个整数 a 和 b。你的任务是找出 a 和 b 是否在 arr 中连续出现,并返回一个布尔值(如果 a 和 b 连续则为 True,否则为 False)。

保证 a 和 b 都存在于 arr 中。

测试示例:

consecutive([1, 3, 5, 7], 3, 7), false
consecutive([1, 3, 5, 7], 3, 1), true 
consecutive([1, 6, 9, -3, 4, -78, 0], -3, 4), true

这是我目前所拥有的:

for (let i = 0; i < arr.length; i++) {
  let index2 = arr.indexOf(b)
  let index1 = arr.indexOf(a)

    let diff = (index2) - (index1)

    if (diff > 1) {
        console.log(diff, 'false');
        return false
    } else {
        console.log(diff, 'true');
        return true
    }
}

测试示例正在通过,但是当我提交解决方案时,其他一些测试没有通过。我看不到没有通过的测试,所以我坚持这一点。另外,我认为,如果 a 和 b 是相同的数字,那么如果我有

cons([4, 6, 4, 5, 6], 4, 4)

我的解决方案无法通过这个测试,那么我该如何改进呢?

【问题讨论】:

  • 找到第一个数字,看看另一个数字是在它之前还是之后的索引中?
  • 您在循环内多次使用 indexOf 来查找相同的值。这真是太无能了。如果您使用低效的方法,其中许多测试都会超时
  • @evolutionxbox 很棒的回复 XD 这是我遇到困难的实用方法!
  • @charlietfl 您的回复非常有效。下次您尝试帮助某人时,请告诉他们为什么他们的做法是错误的。
  • 循环的关键是除了每次运行完全相同的代码之外没有做任何有成效的事情。因此,不是一次运行代码......它运行的次数与数组的长度一样多(或找到的匹配项)。在这些练习中,时间不是你的朋友

标签: javascript arrays


【解决方案1】:

要回答您的问题,您的代码未通过所有测试的原因是因为您没有考虑到当a 出现在b 之后时,diff 将为负数。

所以你应该这样做

let diff = Math.abs(index2 - index1)

而且 for 循环似乎没有做任何事情,所以你可以删除它。

【讨论】:

  • 非常感谢,您的评论真的很有帮助!但是 1) 你怎么知道为什么我的代码没有通过所有的测试?只是想弄清楚这是否是我可以从 codewars 中读取的内容,或者这只是我缺少的一个用例 2)为什么多次使用 indexOf 会被认为效率低下?我刚刚通过了所有测试,许多解决方案都使用了相同的方法......
  • @geek101 1) 你说它没有通过测试 - 2) 它不是那么低效,因为你只运行了两次,但你不应该在每个元素上循环运行它跨度>
  • 我明白了。非常感谢!现在不会忘记 Math.abs() XD
【解决方案2】:

步骤:

  1. 查找给定值的索引
  2. 检查任何一个值 + 或 - 1 的索引是否与其他值相同。

代码:

function consecutive(number_list, value1,value2){
    var index_value_one = number_list.indexOf(value1);
  var index_value_two = number_list.indexOf(value2);
  
  if(index_value_one == (index_value_two + 1) || index_value_one == (index_value_two - 1)){
  return true;
  }
  return false;
  
}

console.log(consecutive([1, 3, 5, 7], 3, 7));
console.log(consecutive([1, 3, 5, 7], 3, 1));
console.log(consecutive([1, 6, 9, -3, 4, -78, 0], -3, 4));

输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多