翻译:疯狂的技术宅

原文: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]
复制代码

算法

  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

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

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

  1. 如果输入数组为空,则我们需要返回 0,因为 num 将是该数组中的唯一元素,所以它在索引为 0 的位置。
  2. 如果 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);
复制代码

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

欢迎关注前端公众号:前端先锋,获取前端工程化实用工具包。

转载于:https://juejin.im/post/5cdd2a0c51882534b84ec574

JavaScript算法题:查找数字在数组中的索引相关推荐

  1. 小小c#算法题 - 1 - 找出数组中满足条件的两个数

    把一些东西放到网上,看的时候方便一些.代码可能有bug且不是最佳解决方案,仅供参考. 题目:输入一个按升序排序的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字. 要求时间复杂度是 ...

  2. 算法题:将一维数组中的非零元素移动到数组前端(后端)

    文章目录 1. 题目 1.1. 输入 1.2. 输出 2. 算法一 2.1. 分析 2.2. 代码 2.3. 结果 3. 算法二 3.1. 分析 3.2. 代码 3.3. 结果 4. 非零元素移动到数 ...

  3. c语言经典算法——查找一个整数数组中第二大数

    https://www.cnblogs.com/dootoo/p/4473958.html 题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大 ...

  4. 【C++】二分法查找某个数字在数组中的下标

    #include<iostream> using namespace std;//利用二分法查找某个数字在数组中的下标 int search(int arr[], int k, int s ...

  5. 查找指定数字在数组中出现的位置(有几次打印几次)

    定义一个方法,查找指定数字在数组中出现的位置(若出现多次,多次打印) 如: 数组[1232]要查找的数是2 则方法内部会打印索引值 1 ,3 数组[1232] 要查找的数是5 则方法每部会打印 &qu ...

  6. 北京林业大学oj实验题search使用函数模板查找不同数据类型数组中元素是否存在

    北京林业大学oj实验题search 使用模板函数的方法来查找不同数据类型数组中的元素是否存在,若存在则返回该元素下标,若不存在则返回-1 题目: 描述 设计一个模板函数,实现在一个给定的数组中查找给定 ...

  7. leetcode贪心算法题集锦(持续更新中)

    leetcode贪心算法题集锦 leetcode贪心算法题集锦(持续更新中).python 和C++编写. 文章目录 leetcode贪心算法题集锦 一.贪心算法 1.盛最多水的容器 2.买股票的最佳 ...

  8. java数组个数无限_基于Java代码实现数字在数组中出现次数超过一半

    下文通过几种方法给大家介绍java数组数字出现次数,具体内容如下所示: 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散 ...

  9. 编写一个程序,从10亿个数字的数组中找出100个最大的数字

    本文翻译自:Write a program to find 100 largest numbers out of an array of 1 billion numbers I recently at ...

最新文章

  1. 机器学习:循环神经网络知识要点
  2. day57:00:26:34
  3. 自定义控件:Viewpager
  4. 网络对抗技术 实验报告 三
  5. 刷脸秒入仓,阿里云云盾实人认证助力心怡科技迎战双11
  6. 局部线性嵌入(LLE)算法matlab可运行
  7. Pandas直接读取arff格式的文件,这种需求还是头一次碰到!
  8. c# u盘使用记录_C# 系统应用之通过注册表获取USB使用记录(一)
  9. subsequence 1(牛客多校第五场记忆化搜索+组合数学)
  10. 嵌入式开发-lesson9-顺序结构程序设计
  11. 征途pak文件修改_传奇技能,第十四祭:装备属性修改与增加新装备
  12. css scroll属性_CSS中的scroll-behavior属性
  13. aspen求理论塔板数_aspen 塔设计
  14. python 回归去掉共线性_线性回归中的多重共线性与岭回归
  15. 加密芯片——3DES算法特点与应用注意事项
  16. 文件打不开只读或服务器未响应,Recovery Toolbox for PowerPoint(PPT修复工具)
  17. 深度 | 苹果略胜微软一筹,为什么说 ARKit 是 AR 的最好选择?
  18. 论文 | 深度学习股票预测
  19. Java常用环境配置(Maven、Mybatis、Spring、SpringMvc、Mybatis)
  20. tmdb电影票房_TMDb Vue.js应用程序:电影数据库应用程序

热门文章

  1. pip无法更新_TensorFlow 2.0开发者测试版发布!每晚更新
  2. javascript实战pdf_《TypeScript开发实战》总结
  3. python3扫雷代码_GitHub - pantaduce/minesweeper: Python代码编写的扫雷游戏
  4. Oracle的ONS创建,Oracle 10gR2 RAC Clusterware ONS服务的管理
  5. 在神经反馈任务中同时进行EEG-fMRI,多模态数据集成的大脑成像数据集
  6. Python-EEG工具库MNE中文教程(3)-MNE中数据结构Epoch及其用法简介
  7. 如何设计Lighthoused定位接收电路
  8. Java foreach与for循环性能对比
  9. Wannafly交流赛1 B 硬币[数学思维/贪心]
  10. 无需VR外设,普林斯顿学霸用DeepHand解放你的双手