根據數字二進位制下 1 的數目排序

pardon110發表於2020-11-06

題面

將陣列中的元素按照其二進位制表示中數字 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 協議》,轉載必須註明作者和本文連結

相關文章