題目描述
給你一個字串陣列 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])
}
}
}
// 原因不贅述,大家都懂