【LeetCode 477】汉明距离总和

15 篇文章 0 订阅
/*
难度:中等
计算一个数组中,任意两个数之间的汉明距离的总和。
两个整数之间的汉明距离是指这两个数的二进制位不同的位置的数目。
注意:数组的元素范围:[0, 10^9]; 数组的长度不超过10^4
*/ 
extension Daily {
	static func test_leetCode477() {
		let x = 1
		let y = 4
		let result = Daily.leetCode477(x: x, y: y)
		print("result: \(result)")
	}
	//10^9,其二进制位最高位不会超过第29位,以最右为第0位
	static let bits = [
		0x20000000, 0x10000000,
		0x8000000, 0x4000000, 0x2000000, 0x1000000,
		0x800000, 0x400000, 0x200000, 0x100000,
		0x80000, 0x40000, 0x20000, 0x10000, 
		0x8000, 0x4000, 0x2000, 0x1000, 
		0x800, 0x400, 0x200, 0x100, 
		0x80, 64, 32, 16, 
		8, 4, 2, 1,
	]
	static func leetCode477(_ nums: [Int]) -> Int {
		var total = 0
		var sum = 0
		for idx in 0..<bits.count {
			for item in nums {
				if item & bits[idx] > 0 {
					sum += 1
				}
			}
			total += sum*(nums.count - sum)
			sum = 0
		}
		return total
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值