題面
將陣列中的元素按照其二進位制表示中數字 1 的數目升序排序。
如果存在多個數字二進位制中 1 的數目相同,則必須將它們按照數值大小升序排列。
返回排序後的陣列。
來源:力扣(LeetCode)
連結:leetcode-cn.com/problems/sort-inte...
思路分析
二制數1計數,後排序
雜湊+排序
- 雜湊二進位制1出現次數分組
- 雜湊值排序,構建雜湊鍵切片並排序
- 依鍵還建
import "sort"
import "strconv"
import "strings"
func sortByBits(arr []int) []int {
m := make(map[int][]int, 0)
for _, v:= range arr {
cnt := strings.Count(strconv.FormatInt(int64(v),2),"1")
if _, ok := m[cnt];ok {
m[cnt]=append(m[cnt], v)
}else{
m[cnt]=[]int{v}
}
}
keys := []int{}
for cnt, grp := range m {
sort.Ints(grp)
m[cnt]=grp
keys = append(keys, cnt)
}
sort.Ints(keys)
rs := []int{}
for _, k := range keys {
rs = append(rs, m[k]...)
}
return rs
}
自定義計數與排序
計數與排序函式
- 右移迴圈計數,求模得二進位制1的個數
- 用golang庫函式
sort.Slice
確定排序規則 sort.Slice
自定義匿名函式入參為切片索引,而非元素值- 或運算模擬條件
if--else
隱性優先順序規則,且運算短路實現多條件斷言
import "sort"
func sortByBits(arr []int) []int {
var Count func(int) int
Count = func(c int)(cnt int){
for ;c > 0;c >>=1 {
cnt += c %2
}
return cnt
}
sort.Slice(arr, func(i,j int)bool {
ic, jc := Count(arr[i]),Count(arr[j])
return ic < jc || ic == jc && arr[i]< arr[j]
})
return arr
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結