华为机考826第一题思路
华为机试第一题:
输入n个无符号整数,两个整数直接用空格隔开,n不超过1000.
加扰步骤:
1.每个整数每两个bit交换位置,如 bit0 bit1,bit2 bit3...
2.再把每个数向右移动两位,溢出的部分依次像下一个整数的最高位移动,末尾的右移两位到第一个数的最高两位
加扰步骤:
1.每个整数每两个bit交换位置,如 bit0 bit1,bit2 bit3...
2.再把每个数向右移动两位,溢出的部分依次像下一个整数的最高位移动,末尾的右移两位到第一个数的最高两位
输入:egg:1 2
输出:1073741824 2147483648
第一题我的总体思路是通过字符串来模拟加扰操作,总体的思路是将所有的整数转换为包含0,1 的列表,然后在列表内部每两位bit进行交换,以及高低位进行拼接,最后在用列表来重构整数。
#华为第一题
def mok_2(n,k=2):
'''把整数转换成二进制的字符列表'''
bits = []
while n:
bits.append(n%k)
n = n//k
if len(bits)<32:
bits.extend([0]*(32-len(bits)))
bits.reverse()
return bits
def rebuild(res):
'''把列表重构为整数'''
nums = []
for i in range(len(res)//32):
this_num = ''.join(str(x) for x in res[i*32:(i+1)*32])
nums.append(int(this_num,2))
return nums
#调用函数
nums = list(map(int,input().split()))
res = []
for num in nums: #所有整数的转换字符列表加入到res中
res.extend(mok_2(num))
for i in range(0, len(res),2): #加扰1
res[i], res[i+1] = res[i+1], res[i]
res = res[-2:]+res[:-2] #加扰2
num = rebuild(res)
print(' '.join([str(x) for x in num]))