Code前端首页关于Code前端联系我们

JavaScript 算法查询:查找数组中数字的索引

terry 2年前 (2023-09-27) 阅读数 63 #数据结构与算法

JavaScript 算法查询可以让我们一睹奇妙的世界。我们需要对数字序列进行升序排序,并找出该数字在数组中的位置。

JavaScript 算法描述

将值(第二个参数)插入到数组(第一个参数)中,并返回已排序数组中的最低索引。返回值必须是数字。例如 getIndexToIns([1,2,3,4], 1.5) 应返回 1,因为 1.5 大于 2( Index 1)。另外,getindextoins([205], 19)必须返回2,因为排序后的数组一定是,1920],19 小于 20 (索引 2)且大于 5(索引 1)。

function getIndexToIns(arr, num) {
  return num;
}

getIndexToIns([40, 60], 50);
复制代码

这个算法题的原题

测试用例

  • getIndexToIns([10, 20, 30, 40, 50], 35)应该返回数字。
  • getIndexToIns([10, 20, 30, 40, 50], 30) 应返回一个数字 2.
  • getIndexToIns([40, 50)],一个 1.
  • getIndexToIns([3, 10, 5], 3) 应返回数字 0.
  • getIndexToIns([5, 3,] ♽ 应返回数字 2.
  • getIndexToIns([ 2,20,10],19)应返回数字2。 ([2, 20, 10], 19) 1) 应返回数字 3
  • getIndexToIns([], 1) 应返回数字 0

解决方案 #1 :

  • , .indexOf() .

    PEDAC

    理解题:有两个输入:数组和数字。目标是将输入数字排序到输入数组中并返回其索引。示例/测试用例:我们不知道输入数组是如何排序的,但是给定的测试用例清楚地表明输入数组应该从小到大排序。

    请注意,如果输入数组为空数组,则最后一个测试用例存在边界问题。

    数据结构:由于我们最终将返回一个索引,因此我们应该坚持使用数组。

    我们将使用一个名为 .indexOf() 的方法:

    .indexOf() 如果元素不存在,则返回该元素不在数组中的第一个索引。然后返回-1。例如:

    let food = ['pizza', 'ice cream', 'chips', 'hot dog', 'cake']
    food.indexOf('chips')
    // returns 2
    food.indexOf('spaghetti')
    // returns -1
    复制代码

    我们将使用 .concat() 而不是 .push()。为什么?因为当您使用 .push() 向数组添加元素时,它会返回新数组的长度。当您使用 .concat() 将元素添加到数组时,它会自行生成一个新数组。例如:

    let array = [4, 10, 20, 37, 45]
    array.push(98)
    // returns 6
    array.concat(98)
    // returns [4, 10, 20, 37, 45, 98]
    复制代码

    算法

    1. num放入arr♽。
    2. arr 按升序排列。
    3. 返回索引 num

    代码:

    function getIndexToIns(arr, num) {
      // Insert num into arr, creating a new array.
         let newArray = arr.concat(num)
      //             [40, 60].concat(50)
      //             [40, 60, 50]
    
      // Sort the new array from least to greatest.
         newArray.sort((a, b) => a - b)
      // [40, 60, 50].sort((a, b) => a - b)
      // [40, 50, 60]
    
      // Return the index of num which is now
      // in the correct place in the new array.
         return newArray.indexOf(num);
      // return [40, 50, 60].indexOf(50)
      // 1
    }
    
    getIndexToIns([40, 60], 50);
    复制代码

    删除局部变量和注释后的代码:

    function getIndexToIns(arr, num) {
      return arr.concat(num).sort((a, b) => a - b).indexOf(num);
    }
    
    getIndexToIns([40, 60], 50);
    复制代码

    解决方案 #2: .sort(),,

    PEDAC 理解题:有两个输入:行和数字。目标是将输入数字排序到输入数组中并返回它们的索引。 示例/测试用例:我们不知道输入数组是如何排序的,但是给定的测试用例清楚地表明输入数组应该从小到大排序。

    这个解决方案必须考虑两种情况:如果上传输入为空,那么我们必须返回0,因为num将是一个元素只有 ,所以它在索引 0 中。

  • 如果按升序排序后num的位置位于arr的末尾,那么我们需要返回的长度。
  • 数据结构:由于我们最终将返回一个索引,因此我们应该坚持使用数组。

    让我们看一下.findIndex()并了解它将如何帮助解决这个挑战:

    .findIndex()索引返回第一个元素。否则,它将返回-1,这意味着没有元素通过测试。例如:

    let numbers = [3, 17, 94, 15, 20]
    numbers.findIndex((currentNum) => currentNum % 2 == 0)
    // returns 2
    numbers.findIndex((currentNum) => currentNum > 100)
    // returns -1
    复制代码

    这对我们很有用,因为我们可以使用 arr 使用 将输入 num 与输入 arr 进行比较。 findindex() .,并按照从小到大的顺序查找它们。

    算法

    1. 如果arr是一个空数组,则返回0
    2. 如果num位于已排序数组的末尾,则返回长度arr
    3. 否则,返回索引 num

    代码

    function getIndexToIns(arr, num) {
      // Sort arr from least to greatest.
        let sortedArray = arr.sort((a, b) => a - b)
      //                  [40, 60].sort((a, b) => a - b)
      //                  [40, 60]
    
      // Compare num to each number in sortedArray
      // and find the index where num is less than or equal to 
      // a number in sortedArray.
        let index = sortedArray.findIndex((currentNum) => num <= currentNum)
      //            [40, 60].findIndex(40 => 50 <= 40) --> falsy
      //            [40, 60].findIndex(60 => 50 <= 60) --> truthy
      //            returns 1 because num would fit like so [40, 50, 60]
    
      // Return the correct index of num.
      // If num belongs at the end of sortedArray or if arr is empty 
      // return the length of arr.
        return index === -1 ? arr.length : index
    }
    
    getIndexToIns([40, 60], 50);
    复制代码

    去除局部变量和注释的代码:

    function getIndexToIns(arr, num) {
      let index = arr.sort((a, b) => a - b).findIndex((currentNum) => num <= currentNum)
      return index === -1 ? arr.length : index
    }
    
    getIndexToIns([40, 60], 50);
    

    作者:前端先锋
    链接:https://juejin.im/post/5c5cdd48b/5c5c48b/5c5cdd48a4d 来源:Nugget
    版权归作者所有。商业转载请联系作者获取授权。非商业转载请注明出处。

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    热门