华为机考826第一题思路

华为机试第一题:
输入n个无符号整数,两个整数直接用空格隔开,n不超过1000.
加扰步骤:
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]))


#华为笔试##笔试题目##华为##校招#
全部评论
我C++直接用的位操作做的,没有转成字符串,并不难
点赞 回复
分享
发布于 2020-08-27 16:00
eg. 不是egg.....我看了半天。。。。还以为要把字母ord()
点赞 回复
分享
发布于 2020-10-14 17:26
联想
校招火热招聘中
官网直投

相关推荐

3 30 评论
分享
牛客网
牛客企业服务