通過這道題,我學會了Go的閉包
阿新 • • 發佈:2022-01-02
通過這道題,我學會了Go閉包
先看這道題吧:
給你一個整數陣列 nums ,請你將陣列按照每個值的頻率 升序 排序。如果有多個值的頻率相同,請你按照數值本身將它們 降序 排序。
請你返回排序後的陣列。
示例 1:
輸入:nums = [1,1,2,2,2,3]
輸出:[3,1,1,2,2,2]
解釋:'3' 頻率為 1,'1' 頻率為 2,'2' 頻率為 3 。
示例 2:
輸入:nums = [2,3,1,3,2]
輸出:[1,3,3,2,2]
解釋:'2' 和 '3' 頻率都為 2 ,所以它們之間按照數值本身降序排序。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/sort-array-by-increasing-frequency
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
這是leetcode上的一道簡單題,處理這道題,常規的思路就是要統計每個數的頻率,然後排序頻率,再對應道數組裡的數,對數組裡的數排一遍,這個過程看起來十分麻煩,但是利用閉包可以輕鬆解決。
什麼是閉包呢?
Go中閉包就是引用了自由變數的函式,我們用一個map統計各個數的頻率,然後在排序中,使用一個捕獲了這個map的閉包,利用map裡統計的頻率進行排序
func frequencySort(nums []int) []int { mymap:=make(map[int]int) for _,v:=range nums{ mymap[v]++ } sort.Slice(nums, func(i, j int) bool { //mymap是函式外的自由變數,在這裡被閉包捕獲了 if mymap[nums[i]]!=mymap[nums[j]]{ return mymap[nums[i]]<mymap[nums[j]] }else{ return nums[i]>nums[j] } }) return nums }
學會了這個,我感覺自己能把排序玩出花來了。