力扣之按身高排序
题目描述
给你一个字符串数组 names
,和一个由 互不相同 的正整数组成的数组 heights
。两个数组的长度均为 n
。
对于每个下标 i
,names[i]
和 heights[i]
表示第 i
个人的名字和身高。
请按身高 降序 顺序返回对应的名字数组 names
。
示例 1:
输入: names = ["Mary","John","Emma"], heights = [180,165,170]
输出: ["Mary","Emma","John"]
解释: Mary 最高,接着是 Emma 和 John 。
示例 2:
输入: names = ["Alice","Bob","Bob"], heights = [155,185,150]
输出: ["Bob","Alice","Bob"]
解释: 第一个 Bob 最高,然后是 Alice 和第二个 Bob 。
力扣原题目地址:https://leetcode.cn/problems/...
思路解法
分析
- 题目中有两块信息,分别是对应的身高数组和姓名数组,不过最终要求的结果却是,按照身高数组的排序返回对应的姓名数组。
- 一想到排序,我们首先要想到js中的
sort(function(a-b){})
排序方法。不过平常使用这个api的时候,我们常常是用做一维数组的排序。 - 实际上二维数组也可以使用这个api的,为什么会提到二维数组呢?
- 因为单个的信息包含两个变量:姓名和身高。所以使用二维数组最合适
思路步骤
- 创建一个二维数组,二维数组中的每一项又是一个小数组,一个个的小数组中都存放两个值,某人的名字和身高。
- 然后根据身高排序
- 将排好序的二维数组遍历,取出其中的名字即可
代码
使用Map集合转二维数组
function sortPeople(names, heights) { // 注意heights数组没有重复项(names数组可能有重复项)
// 两个对应数组,同等长度,取谁的长度都行
let n = names.length
// 首先将名字身高组合成一个map集合
let map = new Map()
for (let i = 0; i < n; i++) {
map.set(heights[i], names[i]) // 取谁,value就是谁
}
// 然后将map集合转换成二维数组,并调用原生js的api排序
let sort2WeiArr = [...map].sort(function (a, b) {
return b[0] - a[0] // 记不清a-b还是b-a没关系,打印看下就行了
})
// 排好序的二维数组再遍历,取出名字项即可
let result = sort2WeiArr.map((item) => {
return item[1]
})
return result
}
const res = sortPeople(names, heights)
console.log('排序结果', res)
tips: Map集合转二维数组:[...Map]
这样写就解构转二维数组了
提交结果图
原地转二维数组
这个就是不使用Map集合了,直接原地转,赋值替代,将原来的一维数组转成二维数组,如下代码:
function sortPeople(names, heights) {
let n = names.length
for (let i = 0; i < n; i++) {
// 原地转二维数组,当然也可以定义一个数组来转,不过耗费内存
// 如:newArr[i] = [heights[i], names[i]]
heights[i] = [heights[i], names[i]] // 原地摇身一变,一维成二维的了
}
// 二维数组排好序
let sort2WeiArr = heights.sort(function (a, b) {
return b[0] - a[0]
})
// 排好序的二维数组再遍历,取出名字项即可
let result = sort2WeiArr.map((item) => {
return item[1]
})
return result
}
const res = sortPeople(names, heights)
console.log('排序结果', res)
提交结果图
对比上述两张结果图,发现第二种方式优于第一种方式
总结
本道题目,复习巩固了以下知识:
- map集合转二维数组的写法
- 二维数组使用sort方法排序
- 一位数组原地转成二维数组
提醒:有的道友可能会这样写,这样写性能就不好了
// 好的方式
let n = names.length
let map = new Map()
for (let i = 0; i < n; i++) {
map.set(heights[i], names[i]) // 取谁,value就是谁
}
// 不好的方式
let map = new Map()
for (let i = 0; i < names.length; i++) {
for (let j = 0; j < heights.length; j++) {
if(i == j){
map.set(heights[i], names[i])
}
}
}
// 原因不赘述,大家都懂
推荐阅读
Echarts的tooltip中动态单位设置(使用formatter函数加工)
需求描述可视化折线图有好几条线,不同的线条单位不一样在鼠标悬浮tooltip的时候,将对应单位对应添加效果图思路:使用tooltip中的formatter函数去控制即可代码复制粘贴即可使用,不难,可能一时间想不到... {代...
水冗水孚
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...
白鲸鱼赞 9阅读 5.2k
openKylin 0.9.5版本正式发布,加速国产操作系统自主创新进程!
2023年1月12日,中国桌面操作系统根社区openKylin(开放麒麟)正式发布openKylin 0.9.5操作系统版本。此版本充分适应5G时代需求,打通平板,PC等设备,实现多端融合,弥补了国产操作系统的短板,有效推动国产操作...
openKylin赞 6阅读 7.9k
不会数学的程序员,只能走到初级开发工程师!
在我还是初级程序员时,每天也都粘贴着代码和包装着接口。那个阶段并没有意识到数学能在编程中起到什么作用,就算学了数学的部分知识,也没法用到编程中。但后来随着编程越来越久,逐步接手核心代码块开发时候,...
小傅哥赞 3阅读 850
杨辉三角的5个特性,一个比一个牛皮!
杨辉三角按照杨辉于1261年所编写的《详解九章算法》一书,里面有一张图片,介绍此种算法来自于另外一个数学家贾宪所编写的《释锁算书》一书,但这本书早已失传无从考证。但可以肯定的是这一图形的发现我国不迟于1...
小傅哥赞 3阅读 1.7k
stackoverflow 提问:“计算两个整数的最小公倍数的最有效方法是什么?”
作者:小傅哥博客:[链接]源码:[链接]沉淀、分享、成长,让自己和他人都能有所收获!😄一、前言嘿,小傅哥怎么突然讲到最大公约数了?这么想你肯定是没有好好阅读前面章节中小傅哥讲到的RSA算法,对于与欧拉结果...
小傅哥赞 3阅读 1.6k
DeepMind 发布强化学习通用算法 DreamerV3,AI 成精自学捡钻石
内容一览:强化学习是多学科领域的交叉产物,其本质是实现自动决策且可做连续决策。本文将介绍 DeepMind 最新研发成果:扩大强化学习应用范围的通用算法 DreamerV3。关键词:强化学习 DeepMind 通用算法
超神经HyperAI赞 1阅读 896
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。