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:字典统计
4.IP地址转换为32位无符号整数
思路:用.分开成4个数。第一部分左移24位,第二部分左移16位,…将四部分结果相加。
s="10.0.3.193"
lis=[int(t) for t in s.split(".")]
sum=0
t=24
for i in range(len(lis)):
item=lis[i]<<t
sum+=item
t-=8
print(sum)
变形:32位整数转IP地址。
def intToBin(n):
b=[]
while True: # 一直循环,商为0时利用break退出循环
y = n % 2 # 余数
n = n // 2 # 商
b = b + [y] # 每一个余数存储到b中
print(b)
if n == 0:
break # 余数为0时结束循环
b.reverse() # 使b中的元素反向排列
b = [str(i) for i in b]
return ''.join(b)
num = 167773121
s = intToBin(num)
t1 = s[:8]
t2 = s[8:16]
t3 = s[16:24]
t4 = s[24:]
print(t1, t2, t3, t4)