1. 程式人生 > 其它 >通過這道題,我學會了Go的閉包

通過這道題,我學會了Go的閉包

通過這道題,我學會了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
}

學會了這個,我感覺自己能把排序玩出花來了。