JS算法题之查找数字在数组中的索引位置

前言

编写算法时,排序是一个非常重要的概念。它有各种各样的种类:冒泡排序、希尔排序、分块块排序,梳排序,鸡尾酒排序,侏儒排序 —— 这些可不是我瞎编的

这个算法题能够让我们一睹精彩的世界。我们必须对数字数组进行升序排序,并找出给定数字在该数组中的位置。

算法说明

将值(第二个参数)插入到数组(第一个参数)中,并返回其在排序后的数组中的最低索引。返回的值应该是一个数字。
例如 getIndexToIns([1,2,3,4], 1.5) 应该返回 1,因为 1.5 大于 1(索引0),但小于 2(索引1)。

同样,getIndexToIns([20,3,5], 19) 应该返回 2,因为数组排序后应该是 [3,5,20] , 19 小于 20 (索引2)且大于 5(索引1)。

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

getIndexToIns([40, 60], 50);

本算法题原题

测试用例

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

解决方案#1:.sort(),. 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(),.findIndex()

PEDAC

理解问题:有两个输入:一个数组和一个数字。我们的目标是将输入的数字在输入数组后中排序后,再返回它的索引。
示例/测试用例:我们不知道输入的数组是以哪种方式排序的,但是提供的测试用例清楚地表明,输入的数组应该从小到大进行排序。

这个解决方案需要考虑两个边界情况:

  • 如果输入数组为空,则我们需要返回 0,因为 num 将是该数组中的唯一元素,所以它在索引为 0 的位置。
  • 如果 num 的位置处于升序排序后的 arr 的末尾,那么我们需要返回 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

这对我们很有用,因为我们可以用 .findIndex() 将输入 num 与输入 arr 中的每个数字进行比较,并找出它从最小到最大的顺序。

算法:

  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);

如果你有其他解决方案或建议,请在评论中分享!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • 在JS数组特定索引处指定位置插入元素的技巧

    如何在JS数组特定索引处指定位置插入元素? 需求: 将一个元素插入到现有数组的特定索引处.听起来很容易和常见,但需要一点时间来研究它. // 原来的数组 var array = ["one", "two", "four"]; // splice(position, numberOfItemsToRemove, item) // 拼接函数(索引位置, 要删除元素的数量, 元素) array.splice(2, 0, "three"

  • 利用js查找数组中指定元素并返回该元素的所有索引示例

    前言 这篇文章主要给大家介绍的是利用js查找数组中指定元素并返回该元素的所有索引的相关资料,文中给出了详细的示例代码,下面话不多说,来看看详细的代码示例吧. 示例代码 //在数组中查找所有出现的x,并返回一个包含匹配索引的数组 function findall(a,x){ var results=[], len=a.length, pos=0; while(pos<len){ pos=a.indexOf(x,pos); if(pos===-1){//未找到就退出循环完成搜索 break; } r

  • javascript检查某个元素在数组中的索引值

    在现在代浏览器中判断一个元素在不在一个数组中,咱们可以用Array对象的indexOf()方法来取得这个元素在当前数组中的索引值,若索引值不等于-1,数组中就存在这个元素, 例如: var arr = [2,53,23,'test',9,'array']; //判断array在不在数组arr中 arr.indexOf('array') !== -1 ? alert('存在') : alert('不存在'); 但是IE9以前的版本都不支持此方法,那咱们就只能扩展一个: 代码如下复制代码 Array

  • js以对象为索引的关联数组

    关于JSON对象,你可以参看wikipedia(http://zh.wikipedia.org/zh-cn/JSON),还有官方网站(http://www.json.org/json-zh.html). 我们常说JavaScript原生支持json,因为我们可以认为json就是对JavaScript的Object对象的灵活应用. 通常我们使用json的方式,主要用作前后台数据交换的格式: 而在代码逻辑中更多的是用关联数组的方式.但即使是这样我们也很少使用对象类型作为键值对的键名. var a=

  • JavaScript通过元素索引号删除数组中对应元素的方法

    本文实例讲述了JavaScript通过元素索引号删除数组中对应元素的方法.分享给大家供大家参考.具体分析如下: JavaScript通过元素的索引号删除数组中的元素,如果要删除第3个元素,则使用RemoveValByIndex(2)即可,JS数组从0开始 function RemoveValByIndex(arr, index) { arr.splice(index, 1); } test = new Array(); test[0] = 'Apple'; test[1] = 'Ball'; t

  • 浅谈Javascript数组索引

    从题目说起,之所以是不完全,是因为有些东西比如数组的方法怎么用这个我都不打算讲,因为那个看一下都会,下面讲的都是我觉得重要的,只关于数组对象本身.另外,由于我的Javascript实战经验不多,所以可能有些东西没涉及到,有些内容说的有误,请发现问题的同学不吝指教. 首先,Javascript(下称js)的数组定义,这不是重点,简单说下,下面两句都是创建一个空的数组: var arr = []; var arr2 = new Array(); // 不写new也可以. 在创建之后,你就可以随时往数

  • JavaScript 以对象为索引的关联数组

    关于JSON对象,你可以参看wikipedia(http://zh.wikipedia.org/zh-cn/JSON),还有官方网站(http://www.json.org/json-zh.html). 我们常说JavaScript原生支持json,因为我们可以认为json就是对JavaScript的Object对象的灵活应用. 通常我们使用json的方式,主要用作前后台数据交换的格式: 而在代码逻辑中更多的是用关联数组的方式.但即使是这样我们也很少使用对象类型作为键值对的键名. var a=

  • JavaScript中的索引数组、关联数组和静态数组、动态数组讲解

    数组分类: 1.从数组的下标分为索引数组.关联数组 复制代码 代码如下: /* 索引数组,即通常情况下所说的数组 */ var ary1 = [1,3,5,8]; //按索引去取数组元素,从0开始(当然某些语言实现从1开始) //索引实际上就是序数,一个整型数字 alert(ary1[0]); alert(ary1[1]); alert(ary1[2]); alert(ary1[3]);   /* 关联数组,指以非序数类型为下标来存取的数组  python中称为字典 */ var ary2 =

  • JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)

    POP 删除最后一项 删除最后一项,并返回删除元素的值:如果数组为空则返回undefine var a = [1,2,3,4,5]; a.pop();//a:[1, 2, 3, 4] a.pop();//a:[1, 2, 3] a.pop();//a:[1, 2] shift 删除第一项 删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefine var a = [1,2,3,4,5]; a.shift(); //a:[2,3,4,5] a.shift(); //a:[3, 4,

  • 在JS数组特定索引处指定位置插入元素

    很多与数组有关的任务听起来很简单,但实际情况并不总是如此,而开发人员在很多时候也用不到他.最近我碰到了这样一个需求: 将一个元素插入到现有数组的特定索引处.听起来很容易和常见,但需要一点时间来研究它. // 原来的数组 var array = ["one", "two", "four"]; // splice(position, numberOfItemsToRemove, item) // 拼接函数(索引位置, 要删除元素的数量, 元素) ar

随机推荐