力扣之按身高排序

水冗水孚發表於2022-12-24

題目描述

給你一個字串陣列 names ,和一個由 互不相同 的正整陣列成的陣列 heights 。兩個陣列的長度均為 n 。

對於每個下標 inames[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的,為什麼會提到二維陣列呢?
  • 因為單個的資訊包含兩個變數:姓名和身高。所以使用二維陣列最合適

思路步驟

  1. 建立一個二維陣列,二維陣列中的每一項又是一個小陣列,一個個的小陣列中都存放兩個值,某人的名字和身高。
  2. 然後根據身高排序
  3. 將排好序的二維陣列遍歷,取出其中的名字即可

程式碼

使用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]) 
        }
    }
}

// 原因不贅述,大家都懂

相關文章