华为OD刷题C卷 - 每日刷题 21(按身高和体重排队,解密犯罪时间)

三段代码分别解决了三个不同的算法问题,下面是对它们的概述:

1、(按身高和体重排队):

这段代码是解决“按身高和体重排队”的问题。它提供了一个Java类Main,其中包含main方法,用于根据学生的身高和体重对学生进行排序,并输出排序后的学生编号。

main方法首先读取学生数量n,然后读取每个学生的身高和体重,存储到HashMap中。接着,使用StringJoiner来构建最终的排序结果字符串。通过流排序,首先按身高升序排序,身高相同的情况下按体重升序排序,体重也相同的情况下按学生编号升序排序。

2、(按身高体重排序 - 优化版):

这段代码是解决“按身高体重排序”问题的优化版本。它提供了一个Java类Main,其中包含main方法和一个内部类Student,用于对学生进行身高和体重的综合排序。

main方法首先读取学生数量n,然后读取所有学生的身高和体重,创建Student对象数组。接着,使用Arrays.sortStudent数组进行排序,排序规则是:优先按身高升序、身高相同按体重升序、体重也相同的情况下按学生编号升序。

3、(解密犯罪时间):

这段代码是解决“解密犯罪时间”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于根据给定的时间字符串,找出所有可能的合法时间,并输出距离给定时间最近的下一个时间。

main方法首先读取原始时间字符串,然后调用getResult方法并打印解密后的时间。

getResult方法首先使用HashSet来存储时间字符串中出现过的所有数字,然后使用回溯法进行全排列,生成所有可能的合法时间字符串。使用正则表达式来验证排列结果是否为合法的时间格式。最后,将所有合法时间字符串排序,并找出距离给定时间最近的下一个时间。

三段代码都展示了基本的排序和搜索算法思想:第一段和第二段代码通过自定义排序规则来解决学生的排序问题,其中第二段代码提供了一个更面向对象的解决方案;第三段代码则通过全排列和正则表达式来解决时间解密问题。三者都通过精心设计的逻辑来优化性能和解决问题。

package OD301;import java.util.*;/*** @description 按身高和体重排队* @level 6*//*** 题目描述* 某学校举行运动会,学生们按编号(1、2、3…n)进行标识,现需要按照身高由低到高排列,对身高相同的人,按体重由轻到重排列;对于身高体重都相同的人,维持原有的编号顺序关系。请输出排列后的学生编号。* <p>* 输入描述* 两个序列,每个序列由n个正整数组成(0 < n <= 100)。第一个序列中的数值代表身高,第二个序列中的数值代表体重。* <p>* 输出描述* 排列结果,每个数值都是原始序列中的学生编号,编号从1开始*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//学生数量int n = sc.nextInt();//身高 <学生编号,身高>Map<Integer, Integer> height = new HashMap<>();for (int i = 0; i < n; i++) {height.put(i + 1, sc.nextInt());}//体重 <学生编号,身高>Map<Integer, Integer> weight = new HashMap<>();for (int i = 0; i < n; i++) {weight.put(i + 1, sc.nextInt());}//先按身高排序,身高相同按体重,体重相同按编号,结果放进StringJoiner中StringJoiner sj = new StringJoiner(" ");height.keySet().stream().sorted((o1, o2) -> {int h1 = height.get(o1);int h2 = height.get(o2);int w1 = weight.get(o1);int w2 = weight.get(o2);if(h1 != h2){return h1 - h2;} else if (h1 == h2 && w1 != w2) {return w1 - w2;}else {return o1 - o2;}}).forEach(s -> {sj.add(Integer.toString(s));});//打印结果System.out.println(sj.toString());}
}package OD301.better;import java.util.Arrays;
import java.util.Scanner;/*** @description 按身高体重排序* @level* @score* @url*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//学生个数int n = Integer.parseInt(sc.nextLine());Student[] students = new Student[n];//身高int[] heights = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();//体重int[] weights = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();;for (int i = 0; i < n; i++) {//编号从1开始students[i] = new Student(i + 1, heights[i], weights[i]);}//排序:优先身高升序、身高相同按体重升序、都相同按编号升序Arrays.sort(students, (s1, s2) -> {if (s1.height != s2.height) {return s1.height - s2.height;}if (s1.weight != s2.weight) {return s1.weight - s2.weight;}return s1.id - s2.id;});//输出for (Student student : students) {System.out.print(student.id + " ");}}static class Student {//学生编号int id;//身高int height;//体重int weight;public Student(int id, int height, int weight) {this.id = id;this.height = height;this.weight = weight;}}}
package OD314;import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @description 解密犯罪时间* @level 5* @score 100*//*** 题目描述* 警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 “HH:MM” 表示的时刻。* <p>* 根据警察和线人的约定,为了隐蔽,该时间是修改过的,* <p>* 解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。* <p>* 每个出现数字都可以被无限次使用。* <p>* 输入描述* 形如HH:SS字符串,表示原始输入。* <p>* 输出描述* 形如HH:SS的字符串,表示推理处理的犯罪时间。* <p>* 备注* 1.可以保证现任给定的字符串一定是合法的。* <p>* 例如,“01:35”和“11:08”是合法的,“1:35”和“11:8”是不合法的。* <p>* 2.最近的时刻可能在第二天。*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] times = sc.nextLine().split(":");String hour = times[0];String minute = times[1];System.out.println(getResult(hour, minute));}//返回下一个距离最近的时间public static String getResult(String hour, String minute) {//存放时间字符,去重Set<Character> set = new HashSet<>();for (int i = 0; i < hour.length(); i++) {set.add(hour.charAt(i));}for (int i = 0; i < minute.length(); i++) {set.add(minute.charAt(i));}//把字符转为char[]Character[] arr = set.toArray(new Character[0]);//存放满足时间格式的结果ArrayList<String> res = new ArrayList<>();//存放当前排列结果LinkedList<Character> path = new LinkedList<>();dfs(arr, path, res);//把满足时间格式的结果升序排列res.sort(String::compareTo);//找到当前时间 在res里面的下标int index = res.indexOf(hour + minute);String recentTime = "";//如果当前的时间是当前组合的最后一个,则下一个时间是第二天的开头if (index == res.size() - 1) {recentTime = res.get(0);} else {recentTime = res.get(index + 1);}//插入 :recentTime = recentTime.substring(0, 2) + ":" + recentTime.substring(2);return recentTime;}//递归,求当前时间的全排列,每个数字可以无限次使用/*** 返回当前时间的全排列** @param arr  组成当前时间的字符列表* @param path 当前的排列* @param res  结构的排列* @return void* @create 2024/3/21 19:24*/public static void dfs(Character[] arr, LinkedList<Character> path, ArrayList<String> res) {//返回上一层标志 path.length=4if (path.size() == 4) {StringBuilder sb = new StringBuilder();for (Character c : path) {sb.append(c);}String timeStr = sb.toString();//判断该排列是否是合法时间Pattern p = Pattern.compile("([01][0-9]|2[0-3])([0-5][0-9])");Matcher m = p.matcher(timeStr);if (m.find()) {res.add(timeStr);}//返回上一层return;}//全排列for (Character c : arr) {//第i个字符开头,后面全排列,字符可以重复使用path.add(c);dfs(arr, path, res);//因为数字可以无限次使用,所有开始下一个字符的时候,需要清除上一个path.removeLast();}}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构(邓俊辉)学习笔记】图07——最短路径

文章目录 0. 概述1. 问题2. 最短路径2.1 最短路径树2.1.1 单调性2.1.2 歧义性2.1. 3 无环性 2.2 Dijkstra 算法2.2.1 贪心迭代2.2.2 实现2.2.3 实例2.2.4 复杂度 0. 概述 学习下最短路径和Dijistra算法 1. 问题 给定带权网络G (V, E)&#xff0c;以及源点&#xff08;source…

4.大模型微调技术LoRA

大模型低秩适配(LoRA)技术 现有PEFT 方法的局限与挑战 Adapter方法,通过增加模型深度而额外增加了模型推理延时。Prompt Tuning、Prefix Tuning、P-Tuning等方法中的提示较难训练,同时缩短了模型可用的序列长度。往往难以同时实现高效率和高质量,效果通常不及完全微调(f…

Vue2事件处理(v-on)

1.事件处理 &#xff08;1&#xff09;指令的语法格式 <标签 v-指令名:事件名"表达式">{{插值语法}}</标签>&#xff08;2&#xff09;"表达式"位置都可以写什么&#xff1f; 常量、JS表达式、Vue实例所管理的XXX 1.1 事件绑定 &#xff0…

51单片机单击按键,数码管显示学号;双击按键,数码管显示全8

1、功能描述 单击按键&#xff0c;数码管显示学号&#xff1b;双击按键&#xff0c;数码管显示全8 2、实验原理 按键输入检测:通过检测按键的电平变化来识别按键是否被按下。当按键被按下时&#xff0c;电平从高变低,单片机通过外部中断或轮询方式检测这一变化。 数码管显示…

Debian常用命令有哪些?

Debian是一种流行的Linux发行版&#xff0c;它提供了一组强大的命令行工具来帮助用户管理系统和文件。以下是一些Debian中常用的命令&#xff0c;按照不同的功能分类进行了归纳&#xff1a; 文件与目录操作 ls 功能&#xff1a;列出目录内容。常用选项&#xff1a; -l&#xf…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《计及电力不平衡风险的配电网分区协同规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

LLVM Cpu0 新后端6

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

【MySQL】 深入了解 MySQL 存储过程:定义、优势及示例

我已经从你的 全世界路过 像一颗流星 划过命运 的天空 很多话忍住了 不能说出口 珍藏在 我的心中 只留下一些回忆 &#x1f3b5; 牛奶咖啡《从你的全世界路过》 在数据库管理系统中&#xff0c;存储过程&#xff08;Stored Procedure&#xff09;是一种重…

探究IOC容器刷新环节初始化前的预处理

目录 一、IOC容器的刷新环节快速回顾 二、初始化前的预处理prepareRefresh源码分析 三、初始化属性源 &#xff08;一&#xff09;GenericWebApplicationContext初始化属性源 &#xff08;二&#xff09;StaticWebApplicationContext初始化属性源 四、初始化早期事件集合…

汇川CodeSysPLC教程03-2-4 RS485

前情回顾 在前面介绍串口通讯的视频当中&#xff0c;我们提到了RS232&#xff0c;也顺带提到了RS485&#xff0c;本期将会对RS485做比较全面的比较和盘点。 什么是RS485&#xff1f; RS485是一种用于串行通信的标准&#xff0c;通常用于工业自动化和远距离数据传输。它在电气…

3.大模型高效微调PEFT

大模型高效微调(PEFT)技术 预训练模型的背景 预训练与微调:传统的微调方法通常涉及对整个预训练模型的参数进行再训练,以适应特定任务。这虽然有效,但计算成本高,且需要大量的标记数据。模型结构:像BERT或GPT这样的模型通常包含数亿甚至数十亿个参数,构成一个深层次的…

Qt——升级系列(Level Four):控件概述、QWidget 核心属性、按钮类控件

目录 控件概述 QWidget 核心属性 核心属性概览 enabled geometry windowTitle windowIcon windowOpacity cursor font toolTip focusPolicy styleSheet 按钮类控件 Push Button Radio Buttion Check Box Tool Button 控件概述 Widget 是 Qt 中的核⼼概念. 英⽂原义是 "…

西门子学习笔记11 - PTO脉冲指令的使用

1、使用指令前的设置 1、打开一个脉冲发生器&#xff0c;并启用 2、选择使用PTO(脉冲A和方向B) 3、硬件设置输出 4、这样前期的准备工作就完成了 2、指令的使用 1、添加指令CTRL_PTO 2、配置如下 3、方向控制程序如下 4、最后进行测试即可

C语言之存储类、作用域、生命周期、链接属性

一 &#xff1a;概念解析 1&#xff1a; 存储类 &#xff08;1&#xff09;存储类就是存储类型&#xff0c;就是描述C语言变量存储在什么地方 &#xff08;2&#xff09;内存有多种管理方法&#xff1a;栈、堆数据段、bss段、.text段......一个变量的存储类属性就是描述…

html--万年历

<!DOCTYPE html> <html lang"zh_CN"><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><meta charset"utf-8" /><title>万年历</title><link rel"styles…

C语言 | Leetcode C语言题解之第142题环形链表II

题目&#xff1a; 题解&#xff1a; struct ListNode* detectCycle(struct ListNode* head) {struct ListNode *slow head, *fast head;while (fast ! NULL) {slow slow->next;if (fast->next NULL) {return NULL;}fast fast->next->next;if (fast slow) {s…

LLVM Cpu0 新后端9 objdump readelf

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

C-Linux: 题集

1 C语言 1 简述 全局变量 和 局部变量的区别: 存储位置:全局变量存储在静态区,局部变量存储在栈上 作用范围:全局变量对整个程序可见,局部变量仅对其定义的函数可见 生命周期:全局变量在程序执行过程中都存在,局部变量的生命周期仅在其所在函数执行期间存在 2 死锁…

EE trade:如何在A股市场中有效设定止盈止损点

A股市场充满机遇和风险&#xff0c;很多投资者在这里实现了财富增长&#xff0c;也有投资者在这里遭受损失。如何在波动性较大的市场中&#xff0c;控制风险&#xff0c;保护利润和本金?止盈止损是关键。 什么是止盈止损? 止盈止损是指在交易中&#xff0c;根据预先设定的条…

【人工智能】AIGC是什么?

AIGC是“人工智能生成内容”&#xff08;Artificial Intelligence Generated Content&#xff09;的缩写&#xff0c;它指的是利用人工智能技术自动创建文本、图像、音频、视频等不同类型的内容。AIGC技术的发展&#xff0c;使得计算机能够模拟人类的创作过程&#xff0c;生成具…