剑指offer_面试题56 :数组中数字出现的次数( python实现 )

一、题目描述

题目:数组中只出现一次的两个数
一个整型数组里除两个数字以外,其他数字都出现两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是 O ( n ) O(n) O(n) ,空间复杂度是 O ( 1 ) O(1) O(1)

  例如,输入数组为 [2,4,3,6,3,2,5,5],输出 4 和 6 。

二、解题思路

  暂略。(此处主要作为书中python实现补充)

三、代码实现

def FindNumsAppearOnce(arr):
    if len(arr)<2:
        return
    resultExclusiveOR = 0
    for i in range(len(arr)):
        resultExclusiveOR = resultExclusiveOR ^ arr[i]
    indexOfOne = FindFirstBitIsOne(resultExclusiveOR)
    num1 = 0
    num2 = 0
    for i in range(len(arr)):
        if IsBitOne(arr[i],indexOfOne):
            num1 = num1^arr[i]
        else:
            num2 = num2^arr[i]
    return num1,num2
        
def FindFirstBitIsOne(num):
	'''
	用于在整数num的二进制表示中找到最右边是1的位
	'''
    indexBit = 0
    while (num & 1 == 0) and num != 0:
        num = num>>1
        indexBit = indexBit+1
    return indexBit

def IsBitOne(num,indexOfOne):
	'''
	判断在num中的二进制表示中从右边数起的indexBit位是不是1
	'''
    num = num>>indexOfOne
    return (num&0x1)

  对以上函数进行简单的样例测试如下:

  1)数组中多对重复的数字

>>> arr = [2,4,3,6,3,2,5,5]
>>> FindNumsAppearOnce(arr)
Out:
(4,6)

  2)数组中没有重复的数字

>>> arr = [3,5]
>>> FindNumsAppearOnce(arr)
Out:
(3,5)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值