华为机考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]))