华为2020招聘8.26笔试记录

华为2020招聘8.26笔试记录

第一题

对输入n个无符号整数,进行二进制的移位和调换进行加扰,加扰后仍然保持n个整数,输出加扰后的n个整数,两个整数之间空格分开。

加扰步骤:
1.先把每个整数每两个bit交换位置,如bit0和bit1交换,bit2和bit3交换,依次类推。
2.再把每个整数向右移2位,溢出的部分,第一个整数的最低2bit移到第二个整数的最高2bit上,第二个整数的最低2bit移到第三个。如果输入只有一个整数,溢出的2bit移到自己的最高2bit上。

说明,无符号整数的范围不超过32bit整数大小。
输入描述
输入n个无符号整数,两个整数直接用空格分开。n不超过1000.
输出描述
输出加扰后的无符号整数,两个整数直接用空格分开。
示例1
输入
1 2
输出
1073741824 2147483648

# strip() 用于移除字符串头尾指定的字符  
#s = 'hhh abdf hhhh'  s2 = s.strip('h')
# map(function, iterable, ...)
# bin(x) bin(10)-> 0b1010  bin() 
#返回一个整数 int 或者长整数 long int 的二进制表示
arr=list(map(int,input().strip().split()))
st=[]
#int-> 32bit
for x in arr:
    # y 获得 x 的二进制表示 并移除头字符'0b'
    y=bin(x).replace('0b','')
    # 把y补全为32bit,int为4字节32bit
    for j in range(32-len(y)):
        y ='0'+y
    st.append(y)

# 奇偶bit数值交换
for i in range(len(st)):
    # te深拷贝st[i]
    te = list(st[i])
    for j in range(16):
        te[2*j],te[2*j+1]=te[2*j+1],te[2*j]
    st[i]=''.join(te)

# x 获取第一个数的溢出后两位
x=st[0][-2:]
res=[]
#循环传递
for i in range(1,len(st)):
    te=x+st[i][:-2]
    res.append(te[:])
    x=st[i][-2:]

#把第n个数溢出发两位加回第一个数的头两位,加在链表尾部
res.append(x+st[0][:-2])

#把二进制转为10进制,先输出第一个数
print(int(res[-1],2), end='')
#按照顺序输出剩余的数
for i in range(len(res) - 1):
    print(' {}'.format(int(res[i],2)), end='')
    # print(int(res[i], 2), end=' ')

第二题

一个仓库的一排连续整齐的摆放了长宽不等的n个矩形箱子(n = [1,100])。现在要这些高低不等的箱子组成的柱形图中,找出一块最大的完整矩形面积来张贴一张海报。

输入描述
依次给出n个矩形箱子的宽度[1,100]和高度[1,100].为简化起见,最多20个箱子
输出描述
海报可用的最大矩形面积。
如果输入参数有任何错误或者非法输入,返回0;
示例
输入
[1,1,1,1,2,1,1],[5,2,5,4,5,1,6]
输出
16

st=input()
for k in range(len(st)):
    if st[k]==']':
        break
w=list(map(int,st[1:k].split(',')))
h=list(map(int,st[k+3:-1].split(',')))
heights=[]

#判断非法条件
if len(w) == 0 or len(h) == 0 \
        or len(w) != len(h) \
        or min(w)<1 or min(h) < 1 \
        or max(w) > 100 or max(h) > 100:
    print(0)

else:
    #把问题变成间隔为1的leetcode 84最大柱面积问题
    for i in range(len(w)):
        for j in range(w[i]):
            heights.append(h[i])

    stack = [-1]
    res = 0
    heights.append(-1)

    for idx, val in enumerate(heights):
        # print(stack[-1], i, val)
        #高的出栈。低的入栈
        while heights[stack[-1]] > val:
            h = heights[stack.pop()]
            res = max(res, h*(idx - stack[-1] -1))
        stack.append(idx)
    print(res)

第三题

X、Y两个人进行猜单词游戏。X想出一个长度为P个字母的单词(无重复字母,全小写),Y进行猜测。当Y提出一个猜测时,X需要给出这个猜测是否正确的说明。如果Y给出的结果中有m个自摸存在且位置正确,n个字母存在位置不正确,那么X需要回答:m,n。现在给出若干次猜测的结果(包括Y提出的猜测单词以及X的回答),给出X想出的单词。(保证只有一个正确的单词)

输入描述
第一行输入单词长度P(1<=P<=26)
第二行输入Y猜测的次数N(0<N<100)
后续N行表示每一次猜测的数据,由三部分组成,各部分之间空格分隔:表示猜测单词的字符串 存在且位置正确的字母个数 存在且位置不正确的字母个数
输出描述
表示X想出的单词的字符串
示例
输入
5
5
cloxy 3 0
cxmnu 1 1
kcotd 2 1
apqud 2 0
bldwz 1 1
输出
cloud

在这里插入代码片
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值