JavaScript算法题:查找数字在数组中的索引
翻译:疯狂的技术宅
原文:medium.freecodecamp.org/how-to-find…
编写算法时,排序是一个非常重要的概念。它有各种各样的种类:冒泡排序、希尔排序、分块块排序,梳排序,鸡尾酒排序,侏儒排序 —— 这些可不是我瞎编的!
这个算法题能够让我们一睹精彩的世界。我们必须对数字数组进行升序排序,并找出给定数字在该数组中的位置。
算法说明
将值(第二个参数)插入到数组(第一个参数)中,并返回其在排序后的数组中的最低索引。返回的值应该是一个数字。 例如
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]
复制代码
算法:
- 将
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()
,.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
中的每个数字进行比较,并找出它从最小到最大的顺序。
算法:
- 如果
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/5cdd2a0c51882534b84ec574
JavaScript算法题:查找数字在数组中的索引相关推荐
- 小小c#算法题 - 1 - 找出数组中满足条件的两个数
把一些东西放到网上,看的时候方便一些.代码可能有bug且不是最佳解决方案,仅供参考. 题目:输入一个按升序排序的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字. 要求时间复杂度是 ...
- 算法题:将一维数组中的非零元素移动到数组前端(后端)
文章目录 1. 题目 1.1. 输入 1.2. 输出 2. 算法一 2.1. 分析 2.2. 代码 2.3. 结果 3. 算法二 3.1. 分析 3.2. 代码 3.3. 结果 4. 非零元素移动到数 ...
- c语言经典算法——查找一个整数数组中第二大数
https://www.cnblogs.com/dootoo/p/4473958.html 题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大 ...
- 【C++】二分法查找某个数字在数组中的下标
#include<iostream> using namespace std;//利用二分法查找某个数字在数组中的下标 int search(int arr[], int k, int s ...
- 查找指定数字在数组中出现的位置(有几次打印几次)
定义一个方法,查找指定数字在数组中出现的位置(若出现多次,多次打印) 如: 数组[1232]要查找的数是2 则方法内部会打印索引值 1 ,3 数组[1232] 要查找的数是5 则方法每部会打印 &qu ...
- 北京林业大学oj实验题search使用函数模板查找不同数据类型数组中元素是否存在
北京林业大学oj实验题search 使用模板函数的方法来查找不同数据类型数组中的元素是否存在,若存在则返回该元素下标,若不存在则返回-1 题目: 描述 设计一个模板函数,实现在一个给定的数组中查找给定 ...
- leetcode贪心算法题集锦(持续更新中)
leetcode贪心算法题集锦 leetcode贪心算法题集锦(持续更新中).python 和C++编写. 文章目录 leetcode贪心算法题集锦 一.贪心算法 1.盛最多水的容器 2.买股票的最佳 ...
- java数组个数无限_基于Java代码实现数字在数组中出现次数超过一半
下文通过几种方法给大家介绍java数组数字出现次数,具体内容如下所示: 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散 ...
- 编写一个程序,从10亿个数字的数组中找出100个最大的数字
本文翻译自:Write a program to find 100 largest numbers out of an array of 1 billion numbers I recently at ...
最新文章
- 机器学习:循环神经网络知识要点
- day57:00:26:34
- 自定义控件:Viewpager
- 网络对抗技术 实验报告 三
- 刷脸秒入仓,阿里云云盾实人认证助力心怡科技迎战双11
- 局部线性嵌入(LLE)算法matlab可运行
- Pandas直接读取arff格式的文件,这种需求还是头一次碰到!
- c# u盘使用记录_C# 系统应用之通过注册表获取USB使用记录(一)
- subsequence 1(牛客多校第五场记忆化搜索+组合数学)
- 嵌入式开发-lesson9-顺序结构程序设计
- 征途pak文件修改_传奇技能,第十四祭:装备属性修改与增加新装备
- css scroll属性_CSS中的scroll-behavior属性
- aspen求理论塔板数_aspen 塔设计
- python 回归去掉共线性_线性回归中的多重共线性与岭回归
- 加密芯片——3DES算法特点与应用注意事项
- 文件打不开只读或服务器未响应,Recovery Toolbox for PowerPoint(PPT修复工具)
- 深度 | 苹果略胜微软一筹,为什么说 ARKit 是 AR 的最好选择?
- 论文 | 深度学习股票预测
- Java常用环境配置(Maven、Mybatis、Spring、SpringMvc、Mybatis)
- tmdb电影票房_TMDb Vue.js应用程序:电影数据库应用程序
热门文章
- pip无法更新_TensorFlow 2.0开发者测试版发布!每晚更新
- javascript实战pdf_《TypeScript开发实战》总结
- python3扫雷代码_GitHub - pantaduce/minesweeper: Python代码编写的扫雷游戏
- Oracle的ONS创建,Oracle 10gR2 RAC Clusterware ONS服务的管理
- 在神经反馈任务中同时进行EEG-fMRI,多模态数据集成的大脑成像数据集
- Python-EEG工具库MNE中文教程(3)-MNE中数据结构Epoch及其用法简介
- 如何设计Lighthoused定位接收电路
- Java foreach与for循环性能对比
- Wannafly交流赛1 B 	硬币[数学思维/贪心]
- 无需VR外设,普林斯顿学霸用DeepHand解放你的双手