解密犯罪时间 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

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. 格式化输出结果: 最终输出找到的最近时刻。

Java

import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String stime = scanner.next();
        int pos = stime.indexOf(":");

        // 记录已经出现的数字
        boolean[] exists = new boolean[10];
        for (char c : stime.toCharArray()) {
            if (Character.isDigit(c)) {
                exists[c - '0'] = true;
            }
        }

        // 小时,分钟,最近的时间间隔(分钟)
        int hour = 0, minute = 0, d = Integer.MAX_VALUE;

        // 原始时间
        int times = Integer.parseInt(stime.substring(0, pos)) * 60 + Integer.parseInt(stime.substring(pos + 1));

        // 枚举所有时间,找到下一个距离当前事件最近的时刻
        // - 如果时间点中有字符未出现,则不考虑该时间点,因为该时间点已经不可能是答案了
        // - 如果时间点中有字符出现:
        //          - 如果时间相同,则不考虑该时间点,因为该时间点已经不可能是答案了
        //          - 如果时间不同,则考虑该时间点,因为该时间点可能是答案了,但是要判断当天还是下一天
        for (int h = 0; h < 24; h++) {
            if (!exists[h % 10] || !exists[h / 10]) continue;

            for (int m = 0; m < 60; m++) {
                int curTimes = h * 60 + m;
                // 字符未出现或时间相同
                if (!exists[m % 10] || !exists[m / 10] || curTimes == times) continue;

                // 计算时间间隔
                int curD = (curTimes > times) ? curTimes - times : 24 * 60 - (times - curTimes);
                if (curD < d) {   // 找到更近的时刻
                    hour = h;
                    minute = m;
                    d = curD;
                }
            }
        }

        System.out.printf("%02d:%02d%n", hour, minute);
    }
}

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)

C++

#include <bits/stdc++.h>

using namespace std;

int main() {
    string stime;
    cin >> stime;
    int pos = stime.find(":");

    bool exists[10];

    for (char c : stime) {
        if (isdigit(c)) exists[c - '0'] = true;
    }

    // 小时,分钟,最近的时间间隔(分钟)
    int hour = 0, minute = 0, d = INT_MAX;

    // 原始时间
    int times = stoi(stime.substr(0, pos)) * 60 + stoi(stime.substr(pos + 1));

    // 枚举所有时间,找到下一个距离当前事件最近的时刻
    // - 如果时间点中有字符未出现,则不考虑该时间点,因为该时间点已经不可能是答案了
    // - 如果时间点中有字符出现:
    //          - 如果时间相同,则不考虑该时间点,因为该时间点已经不可能是答案了
    //          - 如果时间不同,则考虑该时间点,因为该时间点可能是答案了,但是要判断当天还是下一天
    for (int h = 0; h < 24; h++) {
        if (!exists[h % 10] || !exists[h / 10]) continue;

        for (int m = 0; m < 60; m++) {
            int cur_times = h * 60 + m;
            // 字符未出现或时间相同
            if (!exists[m % 10] || !exists[m / 10] || cur_times == times) continue;

            // 计算时间间隔
            int cur_d = (cur_times > times) ? cur_times - times : 24 * 60 - (times + cur_times);
            if (cur_d < d) {   // 找到更近的时刻
                hour   = h;
                minute = m;
                d      = cur_d;
            }
        }
    }

    cout << (hour < 10 ? "0" : "") << hour << ":" << (minute < 10 ? "0" : "") << minute << endl;

    return 0;
}    

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/416984.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ实战学习

RabbitMQ实战学习 文章目录 RabbitMQ实战学习RabbitMQ常用资料1、安装教程2、使用安装包3、常用命令4、验证访问5、代码示例 一、RabbitMQ基本概念1.1. MQ概述1.2 MQ 的优势和劣势1.3 MQ 的优势1. 应用解耦2. 异步提速3. 削峰填谷 1.4 MQ 的劣势1.5 RabbitMQ 基础架构1.6 JMS 二…

图形系统开发实战课程:进阶篇(上)——8.图形样式

图形开发学院&#xff5c;GraphAnyWhere 课程名称&#xff1a;图形系统开发实战课程&#xff1a;进阶篇(上)课程章节&#xff1a;“图形样式”原文地址&#xff1a;https://www.graphanywhere.com/graph/advanced/2-8.html 第八章 图形样式 1. 填充和描边 \quad 在图形系统实战…

vision mamba 运行训练记录,解决bimamba_type错误

下载vision mamba github上的项目后&#xff0c;解压&#xff0c;进入文件夹项目&#xff0c;然后配环境 unzip Vim-main.zip cd Vim-mainconda create -n mamba python3.10.13conda activate mamba pip install torch2.1.1 torchvision0.16.1 torchaudio2.1.1 --index-url ht…

java面试(网络)

TCP和UDP有什么区别&#xff1f;TCP三次握手不是两次&#xff1f; TCP&#xff1a;面向连接&#xff0c;可靠的&#xff0c;传输层通信协议。点对点&#xff0c;占用资源多&#xff0c;效率低。 UDP&#xff1a;无连接&#xff0c;不可靠&#xff0c;传输层通信协议。广播&…

照片中不想要的部分怎么去除?教你几个小妙招

照片在我们的生活中占据着无可替代的地位。它们是我们生活的缩影&#xff0c;定格住我们的瞬间&#xff0c;记录着我们的记忆&#xff0c;让我们可以随时随地回顾过去的美好时光。无论是家庭聚会、旅行、婚礼还是其他重要的场合&#xff0c;我们都会用照片来捕捉这些珍贵的时刻…

springboot 实现本地文件存储

springboot 实现本地文件存储 实现过程 上传文件保存文件&#xff08;本地磁盘&#xff09;返回文件HTTP访问服务器路径给前端&#xff0c;进行效果展示 存储 服务端接收上传的目的是提供文件的访问服务&#xff0c;对于SpringBoot而言&#xff0c;其对静态资源访问提供了很…

【Java设计模式】三、

文章目录 0、案例&#xff1a;咖啡屋1、简单工厂模式 静态工厂&#xff08;不属于23种之列&#xff09;2、工厂方法模式3、抽象工厂模式4、建造者模式5、原型设计模式 0、案例&#xff1a;咖啡屋 模拟咖啡店点餐。咖啡有多种&#xff0c;抽象类&#xff0c;子类为各种咖啡。咖…

element ui富文本编辑器的使用(quill-editor)

引用组件 <el-form-item label"内容"><editor v-model"obj.activity_content" :min-height"192"/> </el-form-item> 组件封装 <template><div><el-upload:action"uploadUrl":before-upload"…

Node.js如何进行性能监控和分析

Node.js作为一款流行的后端开发技术&#xff0c;其性能监控和分析对于保证系统稳定性和性能优化至关重要。在本文中&#xff0c;我们将探讨Node.js如何进行性能监控和分析&#xff0c;以便开发者能够更好地了解系统运行状况并进行必要的优化。 为什么进行性能监控和分析&#…

力扣刷题:141.环形链表

题目&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中…

idea集成git详解教程(实用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可&#xff08;NEXT&#xff09; 2.软件测试 在Windows桌面空白处&#xff0c;点击鼠标右键&#xff0c;弹出右键菜单 Git软件安装后&#xff0c;会在右键菜单中增加两个菜单 Git GUI He…

GTID的使用原理

一.简介 GTID是MySQL 5.6的新特性&#xff0c;其全称是Global Transaction Identifier&#xff0c;可简化MySQL的主从切换以及Failover。GTID用于在binlog中唯一标识一个事务。当事务提交时&#xff0c;MySQL Server在写binlog的时候&#xff0c;会先写一个特殊的Binlog Event&…

机器学习提升秘籍:Scikit-learn学习网站全攻略!

介绍&#xff1a;是一个开源的Python机器学习库&#xff0c;它提供了一整套用于数据挖掘和数据分析的工具&#xff0c;包括各种分类、回归、聚类和降维算法以及模型评估、选择和数据预处理等功能。以下是关于Scikit-learn的一些详细介绍&#xff1a; 算法覆盖广泛&#xff1a;S…

基于SSM SpringBoot vue服装物流管理系统

基于SSM SpringBoot vue服装物流管理系统 系统功能 首页 图片轮播 人个中心 登录注册 后台管理: 登录注册 个人中心 货物信息管理 货物入库管理 订单信息管理 商品出库管理 快递追踪管理 用户管理 供应商信息管理 盘点信息管理 管理员管理 开发环境和技术 开发语言&#xf…

C++初阶:模版相关知识的进阶内容(非类型模板参数、类模板的特化、模板的分离编译)

结束了常用容器的介绍&#xff0c;今天继续模版内容的讲解&#xff1a; 文章目录 1.非类型模版参数2.模板的特化2.1模版特化引入和概念2.2函数模版特化2.3类模板特化2.3.1全特化2.3.1偏特化 3. 模板分离编译3.1分离编译概念3.2**模板的分离编译**分析原因 1.非类型模版参数 模板…

消息中间件之RocketMQ源码分析(二十二)

Broker主从同步流程 配置数据同步流程 配置数据包含4种类型:Topic配置、消费者位点、延迟位点、订阅关系配置。每种配置数据由一个继承自ConfigManager的类来管理&#xff0c;继承关系如图。Slave如何从Master同步这些配置呢?我们先来看一下初始化服务的步骤 第一步:Maste…

5个-最佳开源RPA框架

在最近两年中&#xff0c;RPA加上AI&#xff0c;即智能自动化流程&#xff0c;已经成为频繁讨论的话题&#xff0c;特别是在企业和机构的数字化转型过程中。自动化与智能化成为了提高效率的关键手段&#xff0c;而RPA便是迈向这一未来的起始步骤。 可以将RPA视为人体的躯干神经…

Docker 入门笔记

课程地址 容器技术概述 docker能做什么&#xff1a;将应用程序代码和依赖打包为一个镜像&#xff0c;作为交付介质&#xff0c;在各种环境中部署 相比于虚拟机&#xff0c;docker 只虚拟出一个隔离的程序运行环境&#xff0c;其需要则资源大大减少 容器内的程序就好像直接运…

pytorch 图像数据集管理

目录 1.数据集的管理说明 2.数据集Dataset类说明 3.图像分类常用的类 ImageFolder 1.数据集的管理说明 pytorch使用Dataset来管理训练和测试数据集&#xff0c;前文说过 torchvision.datasets.MNIST 这些 torchvision.datasets里面的数据集都是继承Dataset而来&#xff0c…

QT Mingw编译ffmpeg源码以及测试

文章目录 前言下载msys2ysamFFmpeg 搭建编译环境安装msys2安装QT Mingw编译器到msys环境中安装ysam测试 编译FFmpeg 前言 FFmpeg不像VLC有支持QT的库文件&#xff0c;它仅提供源码&#xff0c;需要使用者自行编译成对应的库&#xff0c;当使用QTFFmpeg实现播放视频以及视频流时…