编程笔试题※python实现※位运算类

1.请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。(与运算)(剑指offer15题)
思路:与运算只有同为1才是1; 所以使用1,10,100…去循环与数字n做与运算,如果结果为true则计数器加1。知道循环的这个数字比n大。

n=int(input(""))
count=0
sum=1
while sum<=n:
    if sum & n:
        count+=1
    sum=sum<<1
print(count)

2.给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。(异或运算)
思路:根据异或运算的特点,相同的数字经过异或运算后结果为0,除单独出现一次的数字外,其他数字都是出现两次的,那么这些数字经过异或运算后结果一定是0。而任何数字与0进行异或运算都是该数字本身。所以对数组所有元素进行异或运算,运算结果就是题目的答案。

nums=[int(n) for n in input().split()]
num=0
for i in range(len(nums)):
        num=num^nums[i]
    return num

3…给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
思路1:统计所有数字中每一位中1出现的总数,那么对于某一位,1出现的次数一定是3的倍数+1或0(3个0是0,3个1是1),那么对这个数%3得到的结果就是目标数字在该位上的值,将每一位的值组合即为所求。

lis = [None]*32
for i in range(32):
        lis[i]=0
    for n in nums:
        r=1
        j=31
        while(j>=0):
            if((n&r)!=0):
                lis[j]+=1
            j-=1
            r=r<<1
    r=1
    j=31
    teg=0
    while(j>=0):
        if(lis[j]%3!=0):
               teg=teg^r
        r=r<<1
        j-=1
    return teg

思路2:假如nums每个元素都刚好3次, 那么sum(nums) 应该是sum(set(nums))的3倍, 现在少的那个差就是因为元素X少出现了两次,所以X就是差除以2


思路3:排序

思路4:字典统计

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章