編程筆試題※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:字典統計

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