本文收录于「2025华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!!
提醒:拒绝一切代考/替考,违法必究!本人所写题库均搜集于互联网。
订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!
具体题目描述如下:
给定一个数组,里面有6个整数,求这个数组能够表示的最大 24 进制的时间是多少,输出这个时间,无法表示输出 invalid.
温馨提醒: 大家在参加华为OD机试时,切记不要仅仅死记硬背题解代码。真正的通过率取决于你对代码的理解能力。建议你在理解基本原理和逻辑的基础上,模仿并自己编写代码,这样才能更有效地应对机试。
输入为一个整数数组,数组内有六个整数。
输入整数数组长度为6,不需要考虑其它长度,元素值为0或者正整数,6 个数字每个数字只能使用一次。
输出为一个 24 进制格式的时间,或者字符串"invalid"。
备注:
输出 时间格式为 xxxxx 式。
输入:
[0,2,3,0,5,6]
输出:
23:56
示例说明:
输入:
输出:
示例说明:
输入:
输出:
示例说明:
题目要求从输入的一个整数数组中生成一个最大时间,满足以下条件:
invalid
。时间格式为HH:MM
,其中:
HH
表示小时(最大为23)。MM
表示分钟(最大为59)。HH
,第一个数字不能大于2
,第二个数字如果是2
,则第二个数字不能大于3
,否则可以为0-9
。MM
,第一个数字不能大于5
,第二个数字可以为0-9
。2
,第二个数字在合理范围内(取决于第一个数字)。5
,第二个数字在0-9
之间。invalid
。invalid
。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);
}
}
时间复杂度:
空间复杂度:
输入处理:
Scanner
读取输入,并将输入的字符串(包含数字和逗号)转换为整数列表。选择合适的数字:
getDataOfLocation
函数根据条件选择合适的数字。该函数通过过滤符合条件的数字并返回最大值来确保贪心选择最大时间。时间生成:
输出结果:
invalid
。本题通过贪心算法选择最大数字来生成有效的24小时制时间。题目考察了字符串处理、贪心策略和数字过滤的结合。通过合理的条件判断和最大值选择,成功生成了符合要求的时间。
[0,2,3,0,5,6]
23:56
根据本地代码进行方法测试,本地运行结果展示如下:
根据本地代码进行方法测试,本地运行结果展示如下:
根据本地代码进行方法测试,本地运行结果展示如下:
针对如上分享OD机试真题之外,这里我还开源全部OD机试原真题源码,供同学们一对一学习!对照每题都有题目号及详细代码注释。Gitee,例如题序号为1,则题解代码对应文件夹OD1,题序号为5,则题解代码对应文件夹OD5,以此类推,目的就是为了方便大家学习,一举上岸!(这里的题序号指专栏导航贴中表格一列的序号)
如果你还想学习更多相关OD真题题解,都建议直接毫不犹豫地学习此专栏「2025华为OD机试真题(全栈版)」,快速掌握Java、Python、C++、JavaScript等多种热门语言详细解题,快速突破华为OD机试,实现高分目标。还将提供线上多端答疑交流,解决你的所有问题!
注意: 上述任意专栏一次订阅,获永久免费阅读权限,后续更新都能学习。
提示: 拒绝一切形式的代考,替考行为,务必诚信考试!!!本人所写题库均搜集于互联网。
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主&最具价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。
-End-