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。相对于其他划分方式,这种划分
子序列和的最小值最大,因此为最终答案

思路

太难了,坐等大佬提供思

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值