20200422华为笔试
第一题
题目描述
一串字符串(包含英文字母、数字以及特殊符号),获取字符串中所有的数字字符,并按从小到大排序输出,不考虑小数点和负数。
输入描述
随机字符串,包含英文字母、数字以及特殊字符等ASCII范围内字符。
输出描述:
输出字符串中的数字字符,并按数字大小从小到大排序,重复数字不合并。
输入
3d50J,Aa3
输出
0335
思路
太简单了,略了
代码
第二题
题目描述
某协议T报文格式如下(以下数据都以16进制描述):
1、每一个T报文以5a开头,以5a结尾,即开始符和结束符都为5a.
2、每个T报文在结尾前有1个字节的长度域,指示报文净荷的长度(不含开始符、结束符、长度域)。
3、T报文中如果出现5a字符,转义成为5b ba。如果出现5b字符,转义成为5b bb.
4、转义过程不影响长度域,或者说长度域是报文转义前的净荷长度。
两个T报文间由5a划分,即两个连续T报文间只需要一个 开始/结束符。
正常数据流都是由大量的T报文经过下面的流程生成,下图示例中第一个报文中含有需要转码的5a和5b数据,第二个报文没有需要转码的数据。
但本题测试数据中有些报文可能未完全按照上面的要求正确生成。
编程要求:
1、检查报文是否满足T报文格式要求,包括开始符、结束符、转义符,并进行长度校验。
2、将满足T报文格式且通过长度校验的正确报文输出到output文件。
3、每一个报文在文件中的先后顺序不能改变,只过滤掉校验不过的报文。
输入描述
一组按 上述流程生成的T报文数据,其中部分报文可能存在错误,报文数据的数据类型都为1 6进制的整数,中间用空格隔开。
注意16进制格式化输入。
输出描述:
经过校验和过滤的报文流,报文数据的数据类型都为1 6进制的整数,中间用空格隔开。
注意格式化输出,每个数据(即每个字节)要按两个字符的格式输出,单字符数字前面补’0’,(如’6’要输出为’06’)。
输入
5a 12 5b ba 34 5b bb 88 05 5a 75 cd bb 62 5a 34 cd 78 cc da fb 06 5a
输出
5a 12 5b ba 34 5b bb 88 05 5a 34 cd 78 cc da fb 06 5a
说明
输入样例中间的报文长度域错误,不能通过校验算法,第一和第三个报文能够通过校验算法 。
思路
题目都是纸老虎,太长了,吓人用的。
代码(Python3)
# str1 = '5a 12 5b ba 34 5b bb 88 05 5a 75 cd bb 62 5a 34 cd 78 cc da fb 06 5a'
# str1 = str1[2:]
str1 = input()[2:]
list1 = list(str1.split('5a')) # 按开始结束符分割
list1 = list(x for x in list1 if x) # 列表去空
# print(list1)
# print(len(list1))
l1 = [item[:-3].strip() for item in list1] # 保存数据
l2 = [int(item[-3:], 16) for item in list1] # 保存校验长度
# print(l1)
# print(l2)
l3 = [0]*len(list1) # 记录该位置的数据和长度是否合法,合法为1,不合法为0
for i, str1 in enumerate(l1):
num = str1.count('5b ba') + str1.count('5b bb') # 记录转义次数
# print('num', num)
if (len(l1[i])+1) // 3 == l2[i] + num: # 需要满足的合法条件
l3[i] = 1 # 合法为1
if str1.count('5b') > str1.count('5b ba') + str1.count('5b bb'):
l3[i] = 0 # 不能存在单独的'5b'
# print(l3)
res = '5a' # 开始符
for i in range(len(list1)):
if l3[i]:
res += list1[i] + '5a' # 加入合法数据以及长度域 以及间隔符
print(res)
第三题
题目描述
把一个包含m个正整数的序列划分成k个(1<k<m<500) 非空的连续子序列,使得每个正整数恰好属于个序列。 设第1个序列的各数之和为S(0),你的任务是让所有S()的最小值尽量大。例如,序列1 2 3 2 5 4划分成3个序列的最优方案为1 2 3 | 2 5 | 4,其中S(1)、S(2)、 S(3)分别为6、7、4,最小值为4;如果划分成1 2 | 3 2 | 5 4,则最小值为3,不如刚才的好。每个整数不超过10^7。如果有多解,S(1 )应尽量大。如果仍然有多解,S(2)应尽量大,依此类推。
输入描述
输入文件中第一-行为m和k
第二行输入m个数据,均为正整数。不必考虑输入正确性校验的问题
输出描述:
输出一行m个数据,并在分割处使用’/'间隔
输入
9 3
100 200 300 400 500 600 700 800 900
输出
100 200 300 400 500 / 600 700 / 800 900
说明
原始输入序列划分为三个子序列,子序列的和分别为1500、1300、1700,最小值为1300。相对于其他划分方式,这种划分
子序列和的最小值最大,因此为最终答案
思路
太难了,坐等大佬提供思