华为OD笔试题
华为目前社招均为OD模式,想要正式编的最好还是通过校招进去,今天做了华为社招的笔试题,三道全AC,下面分享我的代码(输入输出请自行配置)。
第一题:矩阵的最大值
题目描述:
计算规则如下:
每行元素按下标顺序组成一个二进制数(下标越大约排在低位),二进制数的值就是该行的值,矩阵各行之和为矩阵的值。允许通过向左或向右整体循环移动每个元素来改变元素在行中的位置。
比如:
[1,0,1,1,1] 向右整体循环移动两位 [1,1,1,0,1],二进制数为11101 值为29
[1,0,1,1,1] 向左整体循环移动两位 [1,1,1,1,0],二进制数为11110 值为30
输入描述:
数据的第一行为正整数,记录了N的大小,0
输入的第2到n+1行为二维矩阵信息
行内元素边角逗号分割
输出描述:
矩阵的最大值
示例
输入:
5
1,0,0,0,1
0,0,0,1,1
0,1,0,1,0
1,0,0,1,1
1,0,1,0,1
输出:122
说明:
def f(s): #此方法是针对s=["1","0","0","0","1"]求解它二进制最大值 解题想法:向左或向右移动其实都一样,考虑单一方向,问题可简化为定位一个位置, 其右面的元素都转到左面进行二进制大小比对,另外注意由于str[1:2]是等价于str[1](既左开右闭) l=s.split(",") ss="".join(l) m=int(ss,2) for j in range(1,len(ss)): m=max(m,int(ss[j:]+ss[0:j],2)) return m
第二题:TLV编码解码
题目描述:
TLV编码是按TagLengthValue格式进行编码的,一段码流中的信元用tag标识,tag在码流中唯一不重复,length表示信元value的长度,value表示信元的值,码流以某信元的tag开头,tag固定占一个字节,length固定占两个字节,字节序为小端序,现给定tlv格式编码的码流以及需要解码的信元tag,请输出该信元的value。
输入码流的16进制字符中,不包括小写字母;
且要求输出的16进制字符串中也不要包含小写字母;
码流字符串的最大长度不超过50000个字节。
输入描述
第一行为第一个字符串 ,表示待解码信元的tag;
输入第二行为一个字符串, 表示待解码的16进制码流;
字节之间用空格分割。
输出描述
输出一个字符串,表示待解码信元以16进制表示的value。
示例一
tag = input() stream = input().split() i = 0 while i < len(stream): each_tag = stream[i] length = int(stream[i + 2] + stream[i + 1], 16) # 小端序,拼接后转成10进制 if tag == each_tag: value = "" for j in range(length): #tag唯一,因此循环可以放在if里面减少计算量 value += stream[i+3+j]+" " print(value) break else: i = i + 3 + length
第三题:书籍叠放
N = 100 book_l = [[random.randint(1, N), random.randint(1, N)] for _ in range(N)] print(book_l) book_l.sort(reverse=True) print(book_sort) s = time.time() dp = [1 for i in range(len(book_sort))] # bp每一项表示该书底下能叠起来的书的最大值,默认为1,即自己 for i, book in enumerate(book_sort): if i == 0: continue book_pres = book_sort[:i][::-1] # 判断本书能叠在前面哪本书上,不考虑i后面的书,列表排序好后肯定是叠不上的 #倒序是为了下面判断节省时间 for j, book_pre in enumerate(book_pres): if book[0] < book_pre[0] and book[1] < book_pre[1]: a = dp[i - j - 1] + 1 # 本书能叠在某本书上,则本书在某本书的数量上+1,j从0开始,所以-1 dp[i] = max(a, dp[i]) # 取最大值 if max(dp[:i]) < dp[i]: # 若本书为dp中最大值,肯定不能再大了,为节省时间不用再往前判断 break print(max(dp)) print(time.time() - s)