0911华为机考题目总结

第一题

题目描述:

给定两个已经升序排序好的的序列A={a1,a2,a3,…an} 和B={b1,b2,b3…bn} ,一个数R,找出满足以下条件的的(ai,bj)序列对
1.ai<=bj
2.bj和ai两者的距离 满足 bj-ai<=R ,要是该条件不满足,就从序列B中找出 和ai 距离最接近R的一个点bj(同时要满足条件1)
输入样例:A={1,3,5},b={2,4,6},R=1
输出样例:(1,2)(3,4)(5,6)

题目理解:

# 第一题:列出满足条件的所有数对
给定:
1、A、B数列,正整数、排好序、不为空
2、距离R
满足条件:
1、a <= b
2、|a-b| <= R,但如果a在R范围内,找不到对应的b,就找距离最近的一个b,如果没有则丢弃

代码:

#01 原数据
Line = "A={1,3,5},B={2,4,7,8},R=1"
# 最终输出:(1,2)(3,4)(5,6)

#02 划分数据:在时间复杂度和空间复杂度的处理上,使用列表生成式的好处
line = Line.split('=') # ['A', '{1,3,5},B', '{2,4,6},R', '1']
A = [ int(i) for i in list(line[1]) if i != '{' and  i != '}' and  i != ',' and  i != 'B' ]
B = [ int(i) for i in list(line[2]) if i != '{' and  i != '}' and  i != ',' and  i != 'R' ]
R = int(line[-1])

#03 满足条件:
L_list = []
for a in A:
    for b in B:
        # 第一个条件:a <= b
        if a<=b:
            dis_ab = abs(a-b)
            # 在R范围内
            if dis_ab<=R:
                L_list.append((a,b))
                break # 找到即结束当前循环
            # 不在R范围内
            else:
                if dis_ab > R: # 由于A、B序列为排好序的序列,>R的第一个数即为最近的,找到该数后,break循环
                    L_list.append((a,b))
                    break # 找到即结束当前循环
#05 格式化输出
L_str = [str(i) for i in L_list]
s = "".join(L_str)
s = s.replace(" ","") # 去除空格
print(s)

第二题

题目描述:

*对一行给定的字符串进行反转输出,同时去除中间不满足条件的分隔符
输入字符串:I am an 20-years out–standing @ * -stu- dent
去除分割符并反转之后,输出字符串(子字符串以一个空格隔开):dent stu standing out 20-years an am I
分割符描述如下:
1、除了字母、数字和 - 之外,其他的都是分割符,如输入字符串中的@ 等都属于分割符
2、20-years中的’-’ 表示的是连接符,即当‘-’两边都有字母、数字时,‘-’就属于连接符,否则属于分割符
3、out–standing中的‘–’表示分割符,应该拆分为两个字字符串out 和 standing

题目理解:

# 第二题:
1、一个‘-’是字符连接,视为一个组合单词,两个‘--’视为间隔符,视为两个字符串
2、其他均为非法字符,按空格处理
3、倒序输出,各字符串以一个空格间隔
4、单个独立字符串长度为0-20个字节
5、字符串倒序
操作:
0补充:针对多个‘-’的情况,可以将双‘-’替换为空格
1、提取:字母或数字、-、--的组合,如果是单个‘-’,直接去除
2、进一步分析:如果是多个‘-’,切分字符串、去除‘-’,再组合成单词

代码:

#01 原数据
line = "I am an 20-years   out---standing @ * - stu- dent"
#02 补充:去除多"-"
line = line.replace("--"," ")
# 输出:dent stu standing out 20-years an am I
str_list = line.split(' ')# ['I', 'am', 'an', '20-years', '', '', 'out--standing', '@', '*', '-', 'stu-', 'dent']

#03 在字母、数字、间隔符的字符串中,去除掉仅仅是'-',和去除字符串前后的'-'
str_list = [i.strip('-') for i in str_list if i.isalnum() or '-' in i and i != '-']
#04 去除两个“--”的情况
for i in str_list:
    if '--' in i:
        n = str_list.index(i)
        i_list = i.split('--')
        for j in range(len(i_list)):
            if j == 0:
                str_list[n] = i_list[0]
            else:
                str_list.insert(n,i_list[j])
            n+=1
#05 倒序
print(' '.join(str_list[::-1]))

第三题

题目描述:

给定多组原本的航班预订信息(航班号,座位号,乘客姓名),以及多组要改签的航班信息(原本航班号,原本座位号,新航班号,新座位号)
输出最后的航班预订信息,要是有重复的内容,以最新改签的为标准
输入的内容如下: 3 表示原本的航班信息数,2表示要改签的航班数
3
CZ7132,A1,ZHANGSAN
CZ7132,A2,ZHAOSI
CZ7156,A2,WANGWU
2
CZ7132,A1,CZ7156,A2
CZ7156,A2,CZ7156,A3
输出内容如下:
CZ7132,A2,ZHAOSI
CZ7156,A2,ZHANGSA
CZ7156,A3,WANGW

题目理解:

# 第三题:航班改签
#输入:
#3
#CZ7132,A1,ZHANGSAN
#CZ7132,A2,ZHAOSI
#CZ7156,A2,WANGWU
#2
#CZ7132,A1,CZ7156,A2
#CZ7156,A2,CZ7156,A3
#输出
#CZ7132,A2,ZHAOSI
#CZ7156,A2,ZHANGSAN
#CZ7156,A3,WANGWU

# 第三题:
1、航班改签
2、若有重复的内容,以最新改签的为标准
3、按照航班号、座位号排序

代码:

#01 取消的航班
cancel_list = [['CZ7132', 'A1', 'ZHANGSAN'], ['CZ7132', 'A2', 'ZHAOSI'], ['CZ7156', 'A2', 'WANGWU']]
#02 改签的航班
adjust_list = [['CZ7132', 'A1', 'CZ7156', 'A2'], ['CZ7156', 'A2', 'CZ7156', 'A3'],['CZ7132', 'A1', 'CZ7156', 'A2']]

#03 航班汇总,改签去重
for c in cancel_list:
    tag = False # 去重的关键,若有重复的内容,以最新改签的为标准
    for a in adjust_list:
        if c[0] == a[0] and c[1] == a[1]:
            c0 = a[2]
            c1 = a[3]
            tag = True
    if tag == True:
        c[0] = c0
        c[1] = c1
#04 按照航班和座位号排序
num_list = sorted(cancel_list,key = lambda x:(x[0],x[1]))
for i in range(len(num_list)):
    print(",".join(num_list[i]))

参考链接:
https://www.cnblogs.com/wangyu19900123/p/11511018.html

你可能感兴趣的:(编程学习笔记)