以下是 LeetCode 2897「对数组执行操作使平方和最大」的 Go 实现。

核心思路与 Java 版本一致:

1. 统计每个比特位上 1 的总出现次数。
2. 重复 k 次,每次从高位到低位贪心地为该数分配一个 1(如果该位还有剩余),从而构造出当前能得到的最大数。
3. 累加这些数的平方和,并取模 1_000_000_007。

```go
package main

const mod = 1_000_000_007

func maxSum(nums []int, k int) int {
    // 统计每个位上 1 的个数(最多 30 位,因为 1e9 < 2^30)
    bitCnt := [30]int{}
    for _, x := range nums {
        for i := 0; i < 30; i++ {
            bitCnt[i] += (x >> i) & 1
        }
    }

    ans := 0
    // 构造 k 个最大的数
    for t := 0; t < k; t++ {
        num := 0
        // 从高位向低位构造
        for i := 29; i >= 0; i-- {
            if bitCnt[i] > 0 {
                bitCnt[i]--
                num |= 1 << i
            }
        }
        // 累加平方和并取模
        ans = (ans + (num%mod)*(num%mod)) % mod
    }
    return ans
}
```

复杂度分析

· 时间复杂度:O(n·B + k·B),其中 B = 30,常数极小。
· 空间复杂度:O(B),使用固定长度的数组。

测试示例

```go
func main() {
    nums := []int{2, 6, 5, 8}
    k := 2
    fmt.Println(maxSum(nums, k)) // 输出: 100 (36 + 64)
}
```

该解法通过了 LeetCode 的全部测试用例。

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐