477.total-hamming-distance.go 458 B

1234567891011121314151617181920212223
  1. func totalHammingDistanceSlow(nums []int) (dist int) {
  2. n := len(nums)
  3. for i := 0; i < n-1; i++ {
  4. for j := i + 1; j < n; j++ {
  5. dist += bits.OnesCount32(uint32(nums[i] ^ nums[j]))
  6. }
  7. }
  8. return
  9. }
  10. func totalHammingDistance(nums []int) (dist int) {
  11. n := len(nums)
  12. for b := 1 << 31; 1 <= b; b >>= 1 {
  13. k := 0
  14. for _, i := range nums {
  15. if b&i == 0 {
  16. k++
  17. }
  18. }
  19. dist += k * (n - k) // At pos b, k 0s and n-k 1s inc k*(n-k) dist
  20. }
  21. return
  22. }