【华为机试】2023年真题B卷(python)-分班问题

2023-12-20 00:28:57

一、题目

题目描述:

幼儿园两个班的小朋友在排队时混在了一起,每位小朋友都知道自己是否与前面一位小朋友同班,请你帮忙把同班的小朋友找出来。小朋友的编号是整数,与前一位小朋友同班用Y表示,不同班用N表示。学生序号范围(0,999],如果输入不合法则打印ERROR。

二、输入输出

输入描述:
输入为空格分开的小朋友编号和是否同班标志。
输出描述:
输出为两行,每一行记录一个班小朋友的编号,编号用空格分开,且:
1.编号需按照升序排列。
2.若只有一个班的小朋友,第二行为空行。

三、示例

示例1

输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
1/N 2/Y 3/N 4/Y
输出:
1 2
3 4
示例2?

输入输出示例仅供调试,后台判题数据一般不包含示例
输入
1/N 2/Y 3/N -4/Y 5/Y
输出
1 2
3 4 5

四、解题思路

解析输入字符串,根据小朋友的编号和与前一个同学是否同班标志将其分到两个班级中。然后,对每个班级的小朋友编号进行升序排序,并将结果输出。

五、参考代码?

# -*- coding: utf-8 -*-
'''
@File    :   2023-B-分班问题.py
@Time    :   2023/12/18 22:33:03
@Author  :   mgc 
@Version :   1.0
@Desc    :   None
'''

def is_valid_child_num(child_num):
    # 判断小朋友编号是否合法
    return 0 < child_num <= 999


def classify_children(input_str):
    children = input_str.split()

    if len(children) == 0:
        return "ERROR"

    class1, class2 = [], []  # 存储两个班级的小朋友编号
    same_class = True  # 标记是否与前一位小朋友同班

    for child in children:
        child_num, child_sign = int(child.split('/')[0]), child.split('/')[1]

        if not is_valid_child_num(child_num):
            return "ERROR"
        
        if child_sign == "N":
            same_class = not same_class
        if  same_class :
            class1.append(child_num)
        else:
            class2.append(child_num)

    class1.sort()
    class2.sort()

    if class1 == [] or class2 == []:
        class_list = class1 + class2
        return " ".join(map(str, class_list))
    elif class1[0] <= class2[0]:
        return " ".join(map(str, class1)) + "\n" + " ".join(map(str, class2))
    else:
        return " ".join(map(str, class2)) + "\n" + " ".join(map(str, class1))


input_str = input()
result = classify_children(input_str)
print(result)

文章来源:https://blog.csdn.net/u014481728/article/details/135073300
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。