【华为OD机考真题】- 最大时间(B卷-100分)(Java)

本文收录于「2025华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅题库正在疯狂收录中,up!up!up!!
提醒:拒绝一切代考/替考,违法必究!本人所写题库均搜集于互联网。
  
订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!

1. 题目描述

具体题目描述如下:

给定一个数组,里面有6个整数,求这个数组能够表示的最大 24 进制的时间是多少,输出这个时间,无法表示输出 invalid.

本文目录:

    • 1. 题目描述
    • 2. 输入描述
    • ️3. 输出描述
    • 4. 示例演示
      • ✨4.1 示例1
      • ✨4.2 示例2
      • ✨4.3 示例3
    • 5. 解题分析
      • 5.1 问题理解
      • 5.2 解题思路
      • 5.3 问题考点
      • 5.4 解题步骤
    • 6. 解题Coding
      • ✅6.1 代码实现
      • ⏱6.2 时间&空间复杂度
      • ⛓‍6.3 代码解析
      • 6.4 小结
    • 7. 测试用例
      • 7.1 测试用例1
        • ️7.1.1 输入
        • ️7.1.2 输出
        • ️7.1.3 实际运行结果展示
      • 7.2 测试用例2
        • ️7.2.1 输入
        • ️7.2.2 输出
        • ️7.2.3 实际运行结果展示
      • 7.3 测试用例3
        • ️7.3.1 输入
        • ️7.3.2 输出
        • ️7.3.3 实际运行结果展示
    • 8. 附录源码
    • 福利赠与你
      • 安利其他语言版本题解册
    • ‍Who am I?

温馨提醒: 大家在参加华为OD机试时,切记不要仅仅死记硬背题解代码。真正的通过率取决于你对代码的理解能力。建议你在理解基本原理和逻辑的基础上,模仿并自己编写代码,这样才能更有效地应对机试。

2. 输入描述

输入为一个整数数组,数组内有六个整数。
输入整数数组长度为6,不需要考虑其它长度,元素值为0或者正整数,6 个数字每个数字只能使用一次。

️3. 输出描述

输出为一个 24 进制格式的时间,或者字符串"invalid"。
备注:
输出 时间格式为 xxxxx 式。

4. 示例演示

✨4.1 示例1

输入:

[0,2,3,0,5,6]

输出:

23:56

示例说明:

✨4.2 示例2

输入:


输出:


示例说明:

✨4.3 示例3

输入:


输出:


示例说明:

5. 解题分析

5.1 问题理解

题目要求从输入的一个整数数组中生成一个最大时间,满足以下条件:

  1. 数组中每个数字只能使用一次,生成的时间应符合24小时制的格式。
  2. 如果无法生成有效的时间,输出invalid

时间格式为HH:MM,其中:

  • HH表示小时(最大为23)。
  • MM表示分钟(最大为59)。
  • 对于HH,第一个数字不能大于2,第二个数字如果是2,则第二个数字不能大于3,否则可以为0-9
  • 对于MM,第一个数字不能大于5,第二个数字可以为0-9

5.2 解题思路

  1. 输入处理:读取一个包含6个数字的数组。
  2. 检查合法性:根据24小时制的限制,分别确定每个位置的最大数字:
    • 小时的第一个数字不超过2,第二个数字在合理范围内(取决于第一个数字)。
    • 分钟的第一个数字不超过5,第二个数字在0-9之间。
  3. 生成时间:通过贪心策略选择合适的数字,尽量生成最大时间。
  4. 输出结果:如果可以生成有效的时间,输出结果,否则输出invalid

5.3 问题考点

  • 字符串和数字的处理:需要将数字转换成字符串并拼接,生成符合要求的时间格式。
  • 贪心算法:通过优先选择最大数字来生成最大时间。
  • 数据过滤:通过条件过滤来选择符合规则的数字。

5.4 解题步骤

  1. 读取输入并解析:将输入的字符串转换为整数数组。
  2. 根据时间规则筛选合适的数字:根据24小时制规则选择适当的数字。
  3. 生成最大时间:从剩余的数字中选取合适的数字,生成时间。
  4. 输出结果:输出符合规则的时间,或者invalid

6. 解题Coding

✅6.1 代码实现

package com.demo.java.OD601_650.OD609;

import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @des: 【最大时间(B卷-100分)】问题
 * @url: https://blog.csdn.net/weixin_43970743/article/details/146592138
 */
public class OdMain {
    public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);
        String str = in.nextLine().replace("[", "").replace("]", "");
        System.out.println(getResult(str));
    }

    private static String getResult(String line) {
        final String s = "invalid"; // 如果无法生成有效时间
        final String c = ":"; // 时间中的冒号
        String[] strArray = line.split(","); // 拆分输入字符串
        // 转换为整数列表
        List<Integer> list = Arrays.stream(strArray).map(Integer::parseInt).collect(Collectors.toList());
        StringBuilder result = new StringBuilder(); // 存储生成的时间

        // 获取小时的第一个数字(不能大于3)
        int data1 = getDataOfLocation(list, 3);
        if (data1 != -1) {
            list.remove(Integer.valueOf(data1)); // 移除已使用的数字
            result.append(data1);
        } else {
            return s; // 如果无法找到符合条件的数字,返回invalid
        }

        // 第二位小时数字
        if (result.charAt(0) == '2') {
            int data2 = getDataOfLocation(list, 4); // 如果第一位是2,第二位不能超过3
            if (data2 != -1) {
                list.remove(Integer.valueOf(data2));
                result.append(data2);
                result.append(c); // 添加冒号
            } else {
                return s;
            }
        } else {
            int data3 = getDataOfLocation(list, 10); // 第一位是0或1,第二位可以是0-9
            if (data3 != -1) {
                list.remove(Integer.valueOf(data3));
                result.append(data3);
                result.append(c); // 添加冒号
            } else {
                return s;
            }
        }

        // 获取分钟的第一位,最大不能超过5
        int data4 = getDataOfLocation(list, 6);
        if (data4 != -1) {
            list.remove(Integer.valueOf(data4));
            result.append(data4);
        } else {
            return s;
        }

        // 获取分钟的第二位,最大为9
        int data5 = getDataOfLocation(list, 10);
        if (data5 != -1) {
            list.remove(Integer.valueOf(data5));
            result.append(data5);
        } else {
            return s;
        }

        return result.toString(); // 返回生成的时间
    }

    /**
     * 获取数组中比 standard 小的数字中最大的一个数, 没有则返回-1
     */
    static int getDataOfLocation(List<Integer> list, int standard) {
        return list.stream().filter(x -> x < standard).mapToInt(x -> x).max().orElse(-1);
    }
}

⏱6.2 时间&空间复杂度

  • 时间复杂度

    • 将输入的字符串转换为整数列表的时间复杂度是O(n),其中n是数组的长度。
    • 遍历数组并筛选符合条件的数字的时间复杂度是O(n)。
    • 因此,总的时间复杂度是O(n),其中n是数字的个数。
  • 空间复杂度

    • 使用了一个列表来存储数字,因此空间复杂度为O(n),其中n是数组的长度。

⛓‍6.3 代码解析

  1. 输入处理

    • 通过Scanner读取输入,并将输入的字符串(包含数字和逗号)转换为整数列表。
  2. 选择合适的数字

    • 使用getDataOfLocation函数根据条件选择合适的数字。该函数通过过滤符合条件的数字并返回最大值来确保贪心选择最大时间。
  3. 时间生成

    • 根据24小时制规则生成小时和分钟部分。小时部分通过检查第一个和第二个数字的组合生成,分钟部分则通过选择最大的小于6和小于10的数字生成。
  4. 输出结果

    • 如果成功生成有效时间,输出结果;否则,返回invalid

6.4 小结

本题通过贪心算法选择最大数字来生成有效的24小时制时间。题目考察了字符串处理、贪心策略和数字过滤的结合。通过合理的条件判断和最大值选择,成功生成了符合要求的时间。

7. 测试用例

7.1 测试用例1

️7.1.1 输入
[0,2,3,0,5,6]
️7.1.2 输出
23:56
️7.1.3 实际运行结果展示

根据本地代码进行方法测试,本地运行结果展示如下:

【华为OD机考真题】- 最大时间(B卷-100分)(Java)_第1张图片

7.2 测试用例2

️7.2.1 输入

️7.2.2 输出

️7.2.3 实际运行结果展示

根据本地代码进行方法测试,本地运行结果展示如下:

7.3 测试用例3

️7.3.1 输入

️7.3.2 输出

️7.3.3 实际运行结果展示

根据本地代码进行方法测试,本地运行结果展示如下:

8. 附录源码

  针对如上分享OD机试真题之外,这里我还开源全部OD机试原真题源码,供同学们一对一学习!对照每题都有题目号及详细代码注释。Gitee,例如题序号为1,则题解代码对应文件夹OD1,题序号为5,则题解代码对应文件夹OD5,以此类推,目的就是为了方便大家学习,一举上岸!(这里的题序号指专栏导航贴中表格一列的序号)

福利赠与你

  如果你还想学习更多相关OD真题题解,都建议直接毫不犹豫地学习此专栏「2025华为OD机试真题(全栈版)」,快速掌握Java、Python、C++、JavaScript等多种热门语言详细解题,快速突破华为OD机试,实现高分目标。还将提供线上多端答疑交流,解决你的所有问题!

安利其他语言版本题解册

  • 【华为OD机试】2025年真题汇总A+B+C+D+E卷【Python实现】
  • 【华为OD机试】2025年真题汇总A+B+C+D+E卷【Java实现】
  • 【华为OD机试】2025年真题汇总A+B+C+D+E卷【C++实现】
  • 【华为OD机试】2025年真题汇总A+B+C+D+E卷【JavaScript实现】

注意: 上述任意专栏一次订阅,获永久免费阅读权限,后续更新都能学习。
提示: 拒绝一切形式的代考,替考行为,务必诚信考试!!!本人所写题库均搜集于互联网。

‍Who am I?

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主&最具价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

你可能感兴趣的:(华为od,java,python,华为OD机考真题,华为OD,最大时间)