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:字典统计