华为od机试真题:解密犯罪时间 (Python)

alt

题目描述

警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 HH:MM 表示的时刻。

根据警察和线人的约定,为了隐蔽,该事件是修改过的,解密规则为:

利用当前出现过的数字,构造下一个距离当前事件最近的时刻,则该时间为可能的犯罪的时间。每个数字都可以被无限次使用。

输入描述

形如 HH:SS 字符串,表示原始输入。

输出描述

HH:SS 字符串,表示推理处理的犯罪时间。

备注:

  1. 可以保证现任给定的字符串一定是合法的,例如,"01:3501:35" 和 "11:0811:08" 是合法的,"1:351:35"和"11:811:8" 是不合法的。
  2. 最近的时刻可能在第二天。

示例1

输入:
20:12

输出:
20:20

示例2

输入:
23:59

输出:
22:22

题解

这个问题可以分为以下几个步骤来解决:

  1. 记录已经出现的数字: 遍历输入的时间字符串,记录出现过的数字。这里可以使用一个长度为10的布尔数组exists,用于标记数字0到9是否出现过。
  2. 计算原始时间: 将输入的时间字符串转换为分钟表示,方便后续的计算。
  3. 枚举所有时间: 使用两层循环枚举所有可能的小时和分钟,然后计算对应的分钟数,得到当前时间点。
  4. 判断当前时间点是否符合条件: 判断当前小时和分钟的每一位数字是否都在已经出现过的数字中。如果有任何一个数字未出现,说明这个时间点不符合条件,直接跳过。
  5. 计算时间间隔: 计算当前时间点与原始时间的时间间隔,考虑了第二天的情况。
  6. 找到最近的时刻: 通过比较时间间隔找到最近的时刻,更新最近时刻的小时、分钟和时间间隔。
  7. 格式化输出结果: 最终输出找到的最近时刻。

Python

def find_nearest_time(stime):
    # 初始化存在性数组
    exists = [False] * 10

    # 找到时间中的冒号位置
    pos = stime.find(":")
    
    # 遍历时间字符串,标记存在的数字
    for c in stime:
        if c.isdigit():
            exists[int(c)] = True

    # 初始化小时、分钟和最小时间间隔
    hour, minute, d = 0, 0, float('inf')

    # 计算原始时间
    times = int(stime[:pos]) * 60 + int(stime[pos + 1:])

    # 枚举所有时间,找到下一个距离当前事件最近的时刻
    for h in range(24):
        if not exists[h % 10] or not exists[h // 10]:
            continue

        for m in range(60):
            cur_times = h * 60 + m

            # 如果分钟或小时的某一位不存在,或者时间相同,则跳过
            if not exists[m % 10] or not exists[m // 10] or cur_times == times:
                continue

            # 计算时间间隔
            cur_d = cur_times - times if cur_times > times else 24 * 60 - (times - cur_times)
            
            # 找到更近的时刻
            if cur_d < d:
                hour, minute, d = h, m, cur_d

    # 格式化输出结果
    result = "{:02d}:{:02d}".format(hour, minute)
    print(result)

# 从标准输入读取时间字符串
stime = input().strip()

# 调用函数找到最近的时间
find_nearest_time(stime)

2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#面经##华为od机试##华为od题库##华为##秋招#
全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
05-30 12:03
山西大学 C++
offer来了我跪着接:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务