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:字典統計