JavaScript 算法查询:查找数组中数字的索引
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]
复制代码
算法:
- 将
num放入arr♽。 -
arr 按升序排列。 - 返回索引
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() .,并按照从小到大的顺序查找它们。
算法:
- 如果
arr是一个空数组,则返回0。 - 如果
num位于已排序数组的末尾,则返回长度arr。 - 否则,返回索引
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前端网发表,如需转载,请注明页面地址。
code前端网