Python程序员面试算法宝典---解题总结: 第4章 数组 4.5 如何找出数组中出现奇数次的数

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第4章 数组 4.5 如何找出数组中出现奇数次的数

题目:
数组中有N+2个数,其中,N个数出现了偶数次,2个数出现了奇数次(
这两个数不相等),请用O(1)的空间复杂度,找出这两个数。
注意:不需要知道具体位置,只需要找出这两个数。

分析:
应该还是一道关于异或的题目。只不过解法和之前的不同。
举例,假设数组为:
[1,2,3,3,2,1,4,5]
如果仅仅对整个数组的元素异或,那么结果就是那两个出现奇数次
的数的异或结果。
所以是否有办法能求出N个元素和其中一个出现奇数次的异或结果,
则就可以先求出一个出现奇数次的结果,另一个也会求出。
如何构造这样的场景:

关键:
1 书上解法
假设a.b分别是只出现一次的数字,
那么整个数组异或结果为result=a^b
其中找到result中某一位不为0.
那么再遍历一遍数组,找到数组中所有那一位也不为0的元素,
将元素之间进行异或,则必定得到其中一个只出现一次的数字,其值为num1
则另一个数字num2=result^num1

获取某一位为1可以使用将两个数的异或结果result不断向右移动来解决

2 我没想到
是因为忘记利用异或结果中某一位不为0,就可以寻找到所有
该位不为0的元素进行异或就可以得到其中一个数字


参考:
Python程序员面试算法宝典
'''

def findNums(array):
    if not array:
        return None, None
    result = 0
    for value in array:
        result ^= value
    position = 0
    tmpResu
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值