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


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

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
3
30
分享

创作者周榜

更多
牛客网
牛客企业服务