华为机考真题 -- 解密犯罪时间

题目描述:

警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 “HH:MM” 表示的时刻。根据警察和线人的约定,为了隐蔽,该时间是修改过的,解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。每个出现的数字都可以被无限次使用。

输入描述:

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

输出描述:

形如 HH:SS 的字符串,表示推理出来的犯罪时间

特别注意事项:
1. 可以保证线人给定的字符串一定是合法的。例如,“01:35” 和 “11:08” 是合法的,“1:35” 和 “11:8” 是不合法的。
2. 最近的时刻有可能在第二天。

示例1:

输入
18:52

输出
18:55
说明:利用数字 1, 8, 5, 2 构造出来的最近时刻是 18:55,是 3 分钟之后。结果不是 18:51,因为这个时刻是 23 小时 59 分钟之后。

示例2:

输入
23:59

输出
22:22
说明:利用数字 2, 3, 5, 9 构造出来的最近时刻是 22:22。 答案一定是第二天的某一时刻,所以选择可构造的最小时刻为犯罪时间。

C++源码:

#include <iostream>
#include <vector>
#include <set>
#include <string>
#include <cstdlib>

#include <iostream>
using namespace std;

// 检查给定的时间是否合法(即小时小于24,分钟小于60)
bool chcekTime(vector<int>& timeL) {
    return timeL[0] < 24 && timeL[1] < 60;
}

// 计算两个时间之间的分钟差
int cal(vector<int>& a, vector<int>& b) {
    if (a == b) {
        int temp = 24 * 60;
        return temp;
    }
    int timeDiff[] = { b[0] - a[0], b[1] - a[1] };
    if (timeDiff[1] < 0) {
        timeDiff[0]--;
        timeDiff[1] += 60;
    }
    if (timeDiff[0] < 0) {
        timeDiff[0] += 24;
    }
    int diff = timeDiff[0] * 60 + timeDiff[1];
    return diff;
}

// 深度优先搜索,尝试所有可能的时间组合
void dfs(vector<int>& temp, int flag, const set<int>& intTime, vector<int>& last, vector<int>& real) {
    if (flag == 4) {
        if (chcekTime(temp) && cal(last, temp) < cal(last, real)) {
            real = temp;
        }
        return;
    }
    for (int i : intTime) {
        vector<int> begin = temp;
        if (flag == 0) {
            temp[0] = temp[0] +  i * 10;
        }
        else if (flag == 1) {
            temp[0] = temp[0] + i;
        }
        else if (flag == 2) {
            temp[1] = temp[1] + i * 10;
        }
        else {
            temp[1] = temp[1] + i;
        }
        dfs(temp, flag + 1, intTime, last, real);
        temp = begin;
    }
}


void getRealTime(string timeStr, set<int>& intTime) {

    vector<int> last(2);
    // 将字符串形式的时间转换为整数对
    last[0] = (timeStr[0] - '0') * 10 + (timeStr[1] - '0');
    last[1] = (timeStr[3] - '0') * 10 + (timeStr[4] - '0');

    vector<int> real = last;
    vector<int> temp = { 0, 0 };
    int flag = 0;
    dfs(temp, flag, intTime, last, real);

    // 打印时间,格式为HH:MM
    printf("%02d:%02d\n", real[0], real[1]);
}

int main() {

    string timeStr;
    getline(cin, timeStr); // 读入时间
    set<int> intTime;

    // 将时间字符串转换为整数集合
    for (char x : timeStr) {
        if (x != ':') {
            intTime.insert(x - '0');
        }
    }

    getRealTime(timeStr, intTime);

    system("pause");
    return 0;
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为OD机考真题是指华为公司在招聘过程中所使用的在线机考试题目。这些题目旨在评估应聘者的技术能力、逻辑思维以及解决问题的能力。以下是对华为OD机考真题解读的简要说明。 华为OD机考真题的内容丰富多样,主要涵盖计算机科学、网络技术、算法设计、数据结构等多个领域。对于应聘者来说,这些题目不仅要求具备扎实的专业知识,还要求能够将知识应用于实际场景中,并能够灵活运用、创新思考。 在解答华为OD机考真题时,应聘者需要具备良好的解题思路和方法。首先,应聘者需要仔细阅读题目,理解题意和要求,明确问题的关键点。其次,应聘者需要运用所学知识和技能分析问题,并制定解决方案。此时,良好的逻辑思维和分析能力是十分重要的。最后,应聘者需要将解决方案转化为具体的代码实现或解题步骤,并进行测试和验证。 华为OD机考真题的目的是为了筛选出具备优秀技术能力和解决问题能力的人才。在解题过程中,华为注重考察应聘者的创新能力和解决问题的能力,不仅关注结果,还关注解决问题的思路和方法。因此,应聘者在回答真题时除了要给出正确的答案,还需要展现出对问题的全面思考和独立思考的能力。 总之,华为OD机考真题的解答需要应聘者具备扎实的专业知识、良好的解题思路、逻辑思维能力和解决问题的能力。这些真题旨在筛选出具备创新思维和解决问题能力的优秀人才。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值