[刷题] 数组中只出现一次的两个数字

题目:

一个整型数组里面除了两个数字之外, 其他数字都出现两次, 找出这两个不相同的数字.


思路:

如果将两个数字缩减为一个数字只出现一次, 那么可以用异或来做: 将数组的元素依次做异或, 那么由于出现两个数字的异或都抵消掉了, 所以最后得到的结果便是那个只出现一次的数字.
如何将两个数字分到不同的组里呢. 我们如果对题目中的数组做异或, 那么肯定至少有一位为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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值