华为机试真题c卷:中文分词模拟器+手机 App 防沉迷系统

1、中文分词模拟器

给定一个连续不包含空格的字符串,该字符串仅包含英文小写字母及英文标点符号(逗号、分号、句号),同时给定词库,对该字符串进行精确分词。分词原则:采用分词顺序优先且最长匹配原则

输入描述:
第一行输入待分词语句 “ilovechina”,字符串长度限制:0 < length < 256
第二行输入中文词库 “i,love,china,ch,na,ve,lo,this,is,this,word”,词库长度限制:1 < length < 100000
输出描述:
按顺序输出分词结果 “i,love,china”

# 定义 TrieNode 类,每个节点包含一个布尔值 is_word 和一个 TrieNode 类型的数组 children
class TrieNode:
    def __init__(self):
        self.is_word = False  # 标记该节点是否为一个单词的结束
        self.children = [None] * 26  # 存储子节点的数组,每个元素对应一个字母

# 创建 Trie 的根节点
root = TrieNode()

# 插入方法,用于向 Trie 中插入一个单词
def insert(word):
    node = root  # 从根节点开始
    for i in word:
        index = ord(i) - ord('a')  # 计算当前字符对应的索引
        # 如果当前字符对应的子节点为空,则创建一个新的子节点
        if node.children[index] is None:
            node.children[index] = TrieNode()
        # 移动到下一个子节点
        node = node.children[index]
    # 标记当前节点为一个单词的结束
    node.is_word = True

# 输入句子,并将其转换为小写
sentence = input().lower()
# 输入字典,字典中的单词以逗号分隔
dictionary = input().split(",")
for word in dictionary:
    insert(word.lower())  # 将字典中的每个单词插入到 Trie 中

result = []  # 存储结果
i = 0

# 遍历句子中的每个字符
while i < len(sentence):

    # 如果当前字符i不是字母,则直接将其添加到结果中
    if not sentence[i].isalpha():
        result.append(sentence[i])
        i += 1
        continue  # 跳过此次迭代,继续下一次迭代

    # 如果当前字符i是字母,则从句子的末尾开始,寻找以该字符为起点的最长的在字典中存在的单词
    j = len(sentence)
    while j > i:
        node = root
        complete = True
        for k in range(i, j):

            # 如果当前字符不是字母,或者在 Trie 中不存在当前字符对应的节点,则说明i:j字符串不是一个单词,终止for循环
            if not sentence[k].isalpha() or node.children[ord(sentence[k]) - ord('a')] is None:
                complete = False
                break  # 终止循环,不再执行后续的迭代

            # 如果当前字符是字母,且在 Trie 中存在当前字符对应的节点,则移动到下一个子节点继续判断
            node = node.children[ord(sentence[k]) - ord('a')]

        # 如果i:j字符串是一个单词,则终止while循环
        if complete and node.is_word:
            break
        # 如果i:j字符串不是一个单词,则缩短该字符串
        j -= 1

    # 如果没有找到单词,则将当前字符作为一个单独的单词添加到结果中
    if j == i:
        result.append(sentence[i])
        i += 1

    # 如果找到了单词,则将该单词添加到结果中
    else:
        result.append(sentence[i:j])
        i = j

# 输出结果,单词之间以逗号分隔
print(",".join(result))

2、手机 App 防沉迷系统

“手机App 防沉迷系统”能够让每天合理地规划手机 App 使用时间,在正确的时间做正确的事。它的大概原理是这样的:在一天 24 小时内,可以注册每个 App 的允许使用时段一个时间段只能使用一个 App。请编程实现,根据输入数据注册 App,并根据输入的时间点,返回时间点使用的App 名称,如果该时间点没有注册任何 App,请返回字符串“NA”。

优先级 1~5,数字越大,优先级越高;注册使用时段时,如果高优先级的App时间和低优先级的时段有冲突,则系统会自动注销低优先级的时段;如果App的优先级相同,则后添加的 App 不能注册。时间格式 HH:MM,小时和分钟都是两位,不足两位前面补0;起始时间需小于结束时间,否则注册不上;注册信息中的时间段包含起始时间点,不包含结束时间点。

输入描述:
第一行表示注册的 App 数量 N(N ≤ 100)。
第二部分包括 N 行,每行表示一条 App 注册数据,数据以空格分隔,四项数依次表示:App 名称、优先级、起始时间、结束时间。
最后一行输入一个时间点,程序需返回该时间点可以使用的App。

输出描述:
输出一个字符串,表示 App 名称,或 NA 表示空闲时间。

from datetime import datetime

# 定义 App 时间段类
class AppTimeSlot:
    def __init__(self, app_name, priority, start_time, end_time):
        self.app_name = app_name  # App 名称
        self.priority = priority  # 优先级
        self.start_time = start_time  # 开始时间
        self.end_time = end_time  # 结束时间

    # 将字符串解析为固定格式的 datetime 对象的方法
    @staticmethod  # 静态方法可以直接通过类名调用,而不需要创建类的实例。但不具有访问实例属性的能力,定义时不需要传递 self 参数。
    def norm_time(time_str):
        return datetime.strptime(time_str, "%H:%M")

    # 注册 App 时间段的方法
    def app_register(self, app_list):
        conflict = False

        # 检查优先级高于或等于新时间段的现有时间段,若与新时间段冲突则不注册新时间段
        for slot in app_list:
            if slot.priority >= self.priority and slot.start_time < self.end_time and slot.end_time > self.start_time:
                conflict = True
                break
        
        # 若不冲突则注册新时间段
        if not conflict:
            app_list.append(self)

            # 检查优先级低于新时间段的现有时间段,移除与新时间段冲突的现有时间段
            for slot in app_list:
                if slot.priority < self.priority and slot.start_time < self.end_time and slot.end_time > self.start_time:
                    app_list.remove(slot)

        return app_list

    # 获取指定时间点正在使用的 App 名称
    @staticmethod
    def get_app_at_time(app_list, query_time):
        for slot in sorted(app_list, key=lambda x: (-x.priority, x.start_time)):
            if slot.start_time <= query_time < slot.end_time:
                return slot.app_name

        return "NA"

# 主程序

count = int(input())

# 构建App注册表
app_list = [] 
for _ in range(count):
    app_name, priority_str, start_time_str, end_time_str = input().split()
    priority = int(priority_str)
    start_time = AppTimeSlot.norm_time(start_time_str)  # 调用静态方法 time()
    end_time = AppTimeSlot.norm_time(end_time_str)  # 调用静态方法 time()
    
    new_app = AppTimeSlot(app_name, priority, start_time, end_time)  # 定义实例对象
    app_list = new_app.app_register(app_list)  # 使用实例方法 register_app()

# 查询某时间段的可用App
query_time_str = input()
query_time = AppTimeSlot.norm_time(query_time_str)  # 调用静态方法 time()
result = AppTimeSlot.get_app_at_time(app_list, query_time)
print(result)

注:从此题可以体会到类中的方法和函数的区别:实例方法可以不用传参而直接使用对象的属性;静态方法和函数一样不能访问对象的属性,但是封装性更好。

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为OD机试Python)是华为公司面试中的一部分,主要考察应聘者在Python编程方面的能力。这次机试分为A和B两个版本,以下将对这两个版本进行回答。 A的题目较为基础,主要考察应聘者对Python基本语法的掌握和编程思维的实现能力。题目类型包括编程题、选择题和填空题。编程题可能涉及到字符串处理、列表操作、条件语句、循环语句等方面,要求应聘者能够根据题目要求编写符合要求的程序。选择题主要考察对Python知识点的理解和应用能力,答题时要做到准确、简洁。填空题要求填入正确的代码来实现题目的要求。 B的题目稍微更加难一些,主要考察应聘者的逻辑思维和问题解决能力。其中包括编程题、实现题和设计题。编程题可能涉及到复杂的算法问题,要求应聘者能够解决较为困难的编程问题。实现题则要求应聘者能够根据题目给出的要求,实现一个复杂的功能模块。设计题则是要求应聘者设计一个较为完整的系统或者某个模块的设计方案。 通过这次机试华为主要是想了解应聘者对Python编程语言的熟悉程度和实际编程能力。参加华为OD机试需要对Python基础知识进行巩固和复习,并且要能够快速理解和解决编程问题。机试的结果将作为录用决策的重要依据之一,因此应聘者需要在机试中全力以赴,展示自己的实际能力和潜力。此外,机试过程中注重解题思路的清晰和程序代码的规范与简洁,这对于应聘者的评估也是非常重要的。 以上就是对华为OD机试Python真题的简要回答。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值