From 546d3b601a2be997855a0d9da2c5af567ebbfaa5 Mon Sep 17 00:00:00 2001 From: Bird Date: Thu, 28 Sep 2023 22:13:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(1356=20=E6=95=B0=E5=AD=97=E4=BA=8C?= =?UTF-8?q?=E8=BF=9B=E5=88=B61=E6=8E=92=E5=BA=8F):=20=E4=BD=BF=E7=94=A8Go?= =?UTF-8?q?=E5=86=85=E7=BD=AE=E6=8E=92=E5=BA=8F=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1356.根据数字二进制下1的数目排序.md | 41 ++++++++------------ 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/problems/1356.根据数字二进制下1的数目排序.md b/problems/1356.根据数字二进制下1的数目排序.md index cc7a7007..c2455cf0 100644 --- a/problems/1356.根据数字二进制下1的数目排序.md +++ b/problems/1356.根据数字二进制下1的数目排序.md @@ -171,36 +171,29 @@ class Solution: ```go func sortByBits(arr []int) []int { - var tmp int - for i := 0; i < len(arr); i++ { - for j := i+1; j < len(arr); j++ { - // 冒泡排序的手法,但是排序的规则从比大小变成了比位运算1的个数 - if isCmp(arr[i], arr[j]) { - tmp = arr[i] - arr[i] = arr[j] - arr[j] = tmp - } - } + // 是否arr[i]<=arr[j] + // 先比较1的数量,后比较值本身 + cmp := func(i, j int) bool { + c1, c2 := bitCount(arr[i]), bitCount(arr[j]) + if c1 == c2 { + return arr[i] <= arr[j] + } + return c1 <= c2 } + + // 调用库函数 + // 第一个参数是待排序切片,第二个是第i位是否小于第j位的函数 + sort.Slice(arr, cmp) + return arr } -func isCmp(a, b int) bool { - bitA := bitCount(a) - bitB := bitCount(b) - if bitA == bitB { - return a > b - } else { - return bitA > bitB - } -} - -func bitCount(n int) int { - count := 0 - for n != 0 { - n &= (n-1) // 清除最低位的1 +func bitCount(num int) (count int) { + for num != 0 { + num &= num-1 // 每次运算将最右侧的1变成0 count++ } + return count } ```