题目:
一个整型数组里面除了两个数字之外, 其他数字都出现两次, 找出这两个不相同的数字.
思路:
如果将两个数字缩减为一个数字只出现一次, 那么可以用异或来做: 将数组的元素依次做异或, 那么由于出现两个数字的异或都抵消掉了, 所以最后得到的结果便是那个只出现一次的数字.
如何将两个数字分到不同的组里呢. 我们如果对题目中的数组做异或, 那么肯定至少有一位为1, 因为这两个数字不相同, 异或的结果肯定至少有一位是1. 那么我们可以以这一个位置作为划分两个组, 这两个组内分别有那两个要找的数字, 同时在组内的其他数字肯定也是配对的. 在两个组内做异或, 就能找出两个数字.
def seekdif( nums):
tmp = 0
for num in nums:
tmp ^= num
index = 0
while tmp & 1 == 0:
tmp >>= 1
index += 1# 异或找到1的位
part1 = 0
part2 = 0
for num in nums:
if (num >> index) & 1:#将数组分为两部分 分别异或
part1 ^= num
else:
part2 ^= num
return [part1, part2]
题目:
在一个数组中除了一个数字数显一次之外, 其他的数字都出现了三次, 求那个只出现一次的数字.
思路:
将所有数字的位数都加起来, 不能被三整除的那些位, 就是所求数字的为1的位. 基本的思考方向都是从位的角度来思考的, 上面的异或也是考虑的能被二整除的位.
def findonece(nums):
helper = [0] *32 ⭐️ 保存每个位的和
for x in nums:
tmp = x
bit = 0
while bit <= tmp: ⭐️计算每个数字的位
helper[bit] += (tmp >> bit) & 1
bit += 1
ans = 0
for i, bit in enumerate (helper):
if bit % 3 != 0: ⭐️ 不能被三整除的 即所求数为1的位
ans += pow(2,i)
return ans