2019-08-21剑指 数组中只出现一次的数字

2019-08-21  本文已影响0人  mztkenan

50min。对二进制位的处理,分治的思想。
1.花的时间最长的反而是如何求一个数的二进制位数,反而有现成函数,log函数的使用
2.异或的交换律,结合律

# -*- coding:utf-8 -*-
from functools import reduce
import math
from typing import List
class Solution:
    def FindNumsAppearOnce(self, array):
        result=reduce(lambda x,y:x^y,array)
        first_digit=self.get_first_digit(result)
        l1=[]
        l2=[]
        for n in array:
            if n&(1<<(first_digit-1))==0:l1.append(n)
            else:l2.append(n)
        return [reduce(lambda x,y:x^y,l1),reduce(lambda x,y:x^y,l2)]


    def get_first_digit(self,num:int):
        if num==0:return 0
        # length=math.floor(math.log(num,2))+1 if num!=0 else 1# 位数要搞清楚,这里要1
        length=num.bit_length()
        for i in range(int(length)):
            tmp=num&(1<<i) # 每个数位数不同所以从求最低位,其实可以把数右移更简单
            if tmp!=0:return i+1


if __name__ == '__main__':
    t=Solution()
    print(t.FindNumsAppearOnce([1,2,1,2,4,5]))
    print(t.FindNumsAppearOnce([1,3,1,4,4,5]))
    # print(t.get_first_digit(1))
    # print(t.get_first_digit(0))
    # print(t.get_first_digit(2))
    # print(t.get_first_digit(3))
    # print(t.get_first_digit(4))

上一篇下一篇

猜你喜欢

热点阅读