在这里插入图片描述

本篇博客旨在记录自已的笔试刷题的练习,里面注有详细的代码注释以及和个人的思路想法,希望可以给同道之人些许帮助。本人也是小白,水平有限,如果文章中有什么错误或遗漏之处,望各位可以在评论区指正出来,各位共勉💪。

1. 找到通信质量最高的基站

考点:

  • 滑动窗口:维护一个动态窗口内的最优解。
  • 单调队列:高效获取窗口内的最小值(或最优解)。

描述

雨市区中有一条马路,马路从0号路口开始,到N-1号路口结束,在每个路口都架设了最新技术的通信基站,每个基站的信号可以覆盖前后各k个路口的范围,即第i个路口上的基站,可以覆盖[i-k, i+k]这两个路口之间的马路,因此用户的手机处于多个基站的覆盖范围中。每个基站会统计当前接入人数,为保障最佳通信质量,用户手机应选择连接人数最少的基站进行通讯。 这条马路一共N个路口,小明从0号路口出发向前走,求小明在每个路段中的最佳通讯基站。不考虑处于路口中间的特殊场景,只考虑在每个路段中的场景,例如第1个路段为0号路口到1号路口之间的路段,如果基站覆盖范围k=2,此时最佳基站应为0、1、2中连接人数最少的基站。

输入

输入为两行 第一行长度为N的整数数组crossroads[],数组元素以空格分隔,其中crossroads[i]表示i号路口基站的当前接入人数。1 <= crossroads.length数组长度 <= 10^5,0 <= crossroads[i] <= 10^2 第二行为基站覆盖范围k,1 <= k <= crossroads.length 非法输入返回-1。

输出

返回一个数组ret,ret[i]表示i路段上最佳基站的编号,数组元素之间以空格分隔。例如0号路口到1号路口的路段,为0号路段,其最佳基站用ret[0]表示。

用例输入

3 5 8 7 6 7 4

2

用例输出

0 0 1 4 6 6

Code

/*** 【华为】20250528_1_最佳基站* @author QIA* @create 2025-07-19-15:52
*/import java.util.*;public class Main01 {public static List<Integer> bestStations(int[] crossroads, int k) {if (crossroads == null || crossroads.length < 1 || k < 1 || k > crossroads.length) {return Arrays.asList(-1);}int n = crossroads.length;List<Integer> result = new ArrayList<>();for (int i = 0; i < n - 1; i++) {int minCount = Integer.MAX_VALUE;int bestIndex = -1;// 枚举所有基站 jfor (int j = 0; j < n; j++) {int left = j - k;int right = j + k;// 基站 j 能否覆盖路段 [i, i+1]if (left <= i && right >= i + 1) {if (crossroads[j] < minCount || (crossroads[j] == minCount && j < bestIndex)) {minCount = crossroads[j];bestIndex = j;}}}result.add(bestIndex);}return result;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取第一行String[] line1 = sc.nextLine().trim().split(" ");int[] crossroads = new int[line1.length];try {for (int i = 0; i < line1.length; i++) {crossroads[i] = Integer.parseInt(line1[i]);}} catch (Exception e) {System.out.println(-1);return;}// 读取第二行int k;try {k = Integer.parseInt(sc.nextLine().trim());} catch (Exception e) {System.out.println(-1);return;}// 处理并输出结果List<Integer> res = bestStations(crossroads, k);if (res.size() == 1 && res.get(0) == -1) {System.out.println(-1);} else {for (int i = 0; i < res.size(); i++) {System.out.print(res.get(i));if (i != res.size() - 1)System.out.print(" ");}}}
}

2. 游园线路

考点:

  • 最短路径算法:Dijkstra算法或BFS(因为边权非负)。
  • 路径输出:需要记录路径而非仅距离。

描述

某公园每年都会在新年时举办灯会,由于公园面积很大且各景点分散,希望你设计一条游园线路,从某个指定入口景点开始,到某个指定出口景点结束,使得游园总路程最短。最短路线不需要走完所有的景点,且中间允许经过其他出入口景点而不离开公园。

输入

第一行:N,景点个数,景点序号从0开始,N - 1结束。2 <= N <= 15
第二行至第N + 1行:是一个N*N的矩阵,表示各相邻景点之间的距离,距离为0表示不相邻。
第N + 2行:该景点是否是公园出入口(1是,0否)。
第N + 3行:要计算最短线路的入口景点序号和出口景点序号
所有用例的输入确保一定存在符合条件的线路,你无需考虑无解的情况。

输出

具体游园线路,如果有多条符合条件的线路,按景点序号从小到大进行排序。

用例输入

5
0 1 2 0 0
1 0 0 3 0
2 0 0 0 10
0 3 0 0 1
0 0 10 1 0
1 0 1 0 1
0 4

用例输出

0 1 3 4

Code

/*** 【华为】20250528_2_游园线路* @author QIA* @create 2025-07-19-15:55*/
import java.util.*;public class Main02 {static int N;static int[][] graph;static int[] entrances;static int[] dist;static List<Integer>[] prev;static List<Integer> bestPath = null;static List<Integer> path = new ArrayList<>();public static void main(String[] args) {Scanner sc = new Scanner(System.in);try {// 读取 NN = Integer.parseInt(sc.nextLine().trim());if (N < 2 || N > 15) {System.out.println("非法景点数量");return;}// 读取邻接矩阵graph = new int[N][N];for (int i = 0; i < N; i++) {String[] row = sc.nextLine().trim().split("\\s+");if (row.length != N) {System.out.println("邻接矩阵行数错误");return;}for (int j = 0; j < N; j++) {graph[i][j] = Integer.parseInt(row[j]);}}// 读取出入口信息entrances = new int[N];String[] entryLine = sc.nextLine().trim().split("\\s+");if (entryLine.length != N) {System.out.println("入口数组长度错误");return;}for (int i = 0; i < N; i++) {entrances[i] = Integer.parseInt(entryLine[i]);}// 读取起止点String[] startEnd = sc.nextLine().trim().split("\\s+");if (startEnd.length != 2) {System.out.println("起止点输入格式错误");return;}int start = Integer.parseInt(startEnd[0]);int end = Integer.parseInt(startEnd[1]);// 求最短路径dijkstra(start);dfs(end, start);// 输出最短路径for (int i = 0; i < bestPath.size(); i++) {System.out.print(bestPath.get(i));if (i != bestPath.size() - 1) System.out.print(" ");}} catch (Exception e) {System.out.println("输入格式错误: " + e.getMessage());}}// Dijkstra + prev 路径追踪public static void dijkstra(int start) {dist = new int[N];Arrays.fill(dist, Integer.MAX_VALUE);dist[start] = 0;prev = new ArrayList[N];for (int i = 0; i < N; i++) prev[i] = new ArrayList<>();PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));pq.offer(new int[]{start, 0});while (!pq.isEmpty()) {int[] cur = pq.poll();int u = cur[0], d = cur[1];if (d > dist[u]) continue;for (int v = 0; v < N; v++) {if (graph[u][v] > 0) {int newDist = dist[u] + graph[u][v];if (newDist < dist[v]) {dist[v] = newDist;prev[v].clear();prev[v].add(u);pq.offer(new int[]{v, newDist});} else if (newDist == dist[v]) {prev[v].add(u);}}}}}// 回溯寻找字典序最小路径(关键修复:排序 prev[node])public static void dfs(int node, int start) {path.add(node);if (node == start) {List<Integer> temp = new ArrayList<>(path);Collections.reverse(temp);if (bestPath == null || comparePath(temp, bestPath) < 0) {bestPath = temp;}} else {List<Integer> sortedPrev = new ArrayList<>(prev[node]);Collections.sort(sortedPrev); // ✅ 关键排序,保证字典序最小for (int pre : sortedPrev) {dfs(pre, start);}}path.remove(path.size() - 1);}// 比较两个路径字典序public static int comparePath(List<Integer> a, List<Integer> b) {int len = Math.min(a.size(), b.size());for (int i = 0; i < len; i++) {if (!a.get(i).equals(b.get(i))) {return Integer.compare(a.get(i), b.get(i));}}return Integer.compare(a.size(), b.size());}
}

3. 爬山路线规划

考点:

  • BFS(广度优先搜索):最少步数问题。

描述

给定一个二维数组 mountainMap 表示一座山的地图,数组中的每个元素 mountainMap[x][y] 代表坐标 (x, y) 处山的高度。登山员从山底出发,爬到山峰。
山底的含义:mountainMap中高度为0的坐标点。
山峰的含义:mountainMap中高度最高的坐标点。
登山员每次移动只能从当前位置向上下左右四个方向移动一格,向高处移动时,移动到的位置山的高度不能高于当前位置的高度加上固定的攀登能力值climbAbility;向低处移动时,移动到的位置的山的高度不能低于当前位置山的高度减去climbAbility。

输入

  1. 第一行为climbAbility的值。
  2. 第二行为mountainMapRows mountainMapCols。
  3. 从第三行开始为mountainMapRows行mountainMapCols列的高度二维数组mountainMap[mountainMapRows][mountainMapCols],每行的高度数字中间用空格分割。

输出

从山底移动到山峰,最少移动次数。
如果无法移动至山峰,则输出-1

用例输入

1
4 5
1 1 1 1 1
1 0 1 2 1
1 1 1 3 1
1 1 1 1 1

用例输出

3

Code

/*** 【华为】20250528_3_爬山路线规划* @author QIA* @create 2025-07-19-16:01*/
import java.util.*;public class Main03 {static int[][] dirs = {{0,1},{1,0},{0,-1},{-1,0}};public static void main(String[] args) {Scanner sc = new Scanner(System.in);int climbAbility = Integer.parseInt(sc.nextLine().trim());String[] dims = sc.nextLine().trim().split("\\s+");int rows = Integer.parseInt(dims[0]);int cols = Integer.parseInt(dims[1]);int[][] map = new int[rows][cols];int maxHeight = Integer.MIN_VALUE;List<int[]> bottoms = new ArrayList<>();  // 高度为0的山底List<int[]> peaks = new ArrayList<>();    // 高度最高的山峰// 读取地图并找山底和山峰for (int i = 0; i < rows; i++) {String[] line = sc.nextLine().trim().split("\\s+");for (int j = 0; j < cols; j++) {map[i][j] = Integer.parseInt(line[j]);if (map[i][j] == 0) {bottoms.add(new int[]{i, j});}if (map[i][j] > maxHeight) {maxHeight = map[i][j];peaks.clear();peaks.add(new int[]{i, j});} else if (map[i][j] == maxHeight) {peaks.add(new int[]{i, j});}}}int[][] dist = new int[rows][cols];for (int[] row : dist) Arrays.fill(row, -1);// BFS from all bottomsQueue<int[]> queue = new LinkedList<>();for (int[] b : bottoms) {queue.offer(b);dist[b[0]][b[1]] = 0;}while (!queue.isEmpty()) {int[] cur = queue.poll();int x = cur[0], y = cur[1];for (int[] d : dirs) {int nx = x + d[0], ny = y + d[1];if (nx >= 0 && nx < rows && ny >= 0 && ny < cols) {int heightDiff = Math.abs(map[nx][ny] - map[x][y]);if (heightDiff <= climbAbility && dist[nx][ny] == -1) {dist[nx][ny] = dist[x][y] + 1;queue.offer(new int[]{nx, ny});}}}}// 找到最短步数到达山峰int minSteps = Integer.MAX_VALUE;for (int[] peak : peaks) {int d = dist[peak[0]][peak[1]];if (d != -1) minSteps = Math.min(minSteps, d);}System.out.println(minSteps == Integer.MAX_VALUE ? -1 : minSteps);}
}

有帮助的话,希望可以点赞❤️+收藏⭐,谢谢各位大佬~~✨️✨️✨️

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

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

相关文章

新浪微博APP v14.5.0:连接世界的社交媒体平台

新浪微博APP 是一款广受欢迎的社交媒体应用程序&#xff0c;凭借其强大的功能和丰富的社交生态&#xff0c;成为用户获取信息、表达观点、互动交流的重要平台。最新版 v14.5.0 内置了微博助手 v2.3.0&#xff0c;进一步提升了用户体验和功能多样性。 软件功能 1. 发布微博 用…

静态枚举返回(简单实现字典功能)

枚举缓存策略的实现与应用 通过静态Map缓存枚举类的Class对象&#xff0c;避免每次请求时重复反射加载。核心实现是一个包含枚举类名与对应Class映射的Registry类&#xff1a; public class EnumRegistry {private static final Map<String, Class<?>> ENUM_MAP …

深分页性能问题分析与优化实践

在日常测试工作中&#xff0c;我们经常会遇到分页查询接口&#xff0c;例如&#xff1a; GET /product/search?keyword&pageNum1&pageSize10乍看之下&#xff0c;这样的分页接口似乎并无性能问题&#xff0c;响应时间也很快。但在一次性能压测中&#xff0c;我们复现了…

LeetCode——1957. 删除字符使字符串变好

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff1a;给你一个字符串&#xff0c;然后让你删除几个字符串&#xff0c;让他变成好串&#xff0c;好串的定义就是不要出现连续的3个一样的字符。思路&#xff1a;首先就是要遍历字符串。我们将要返回的字符串定义为ret&…

Aerospike与Redis深度对比:从架构到性能的全方位解析

在高性能键值存储领域&#xff0c;Aerospike与Redis是两款备受关注的产品。Redis以其极致的单机性能和丰富的数据结构成为主流选择&#xff0c;而Aerospike则凭借分布式原生设计和混合存储架构在大规模场景中崭露头角。本文将从架构设计、数据模型、性能表现、扩展性等核心维度…

Linux命令速查手册

一、命令格式与辅助工具类别符号/命令示例说明基本格式commandls -a /home命令 选项 参数管道符ls -lless重定向>df -h > disk_usage.txt覆盖写入文件>>echo "New" >> notes.txt追加写入文件2>ls non_exist 2> error.txt错误输出重定向快捷…

net-snmp添加自定义mib树

首先我们把前面mib2c生成的文件修改 下面重新做了个简单点的MIB树 -- -- -- MIB generated by MG-SOFT Visual MIB Builder Version 6.0 Build 88 -- Saturday, July 26, 2025 at 09:24:54 --ARHANGELSK-GLOBAL-REG DEFINITIONS :: BEGINIMPORTSenterprises, OBJECT-TYPE, M…

【动态规划-斐波那契数列模型】理解动态规划:斐波那契数列的递推模型

算法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;动态规划是一种解决最优化问题的强大技术&#xff0c;通过将问题分解为子问题并逐步求解来实现高效计算。斐波那契数列是动态规划中经典的应用之一&#xff0c;其递推关系非常适合用动态规划进行优化。通过动态…

微信小程序 自定义带图片弹窗

1. 微信小程序 自定义带图片弹窗1.1. 实现思路使用官方组件实现图片模态弹窗。首先找到官方文档&#xff1a;​显示模态弹窗的API wx.showModal(OBJECT)wx.showModal参数介绍发现并没有设置图片的参数&#xff0c;但是这是一个API&#xff0c;但是组件呢&#xff1f;我并没有在…

私有化大模型架构解决方案构建指南

内容概要本指南旨在为企业提供私有化大模型架构解决方案的全面构建路径&#xff0c;帮助其在保障数据隐私的同时提升业务效率。我们将系统解析关键环节&#xff0c;包括安全部署策略设计、模型训练核心技术、持续优化机制构建以及知识管理实践路径。此外&#xff0c;指南还涵盖…

面试150 查找和最小的K对数字

思路1 超时法&#xff1a;通过两个循环记录三元组[num1,num2,num1num2]然后通过num1num2从小到大进行排序&#xff0c;然后返回前K个对数中的前两个数即可。 class Solution:def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:if n…

vscode目录,右键菜单加入用VSCode打开文件和文件夹(快速解决)(含删除)(脚本)

1.创建文本文件 在桌面右键单击&#xff0c;选择“新建” > “文本文档”&#xff0c;将其命名为“vscode.txt”2.复制代码内容3.修改文件扩展名 右键单击“vscode.txt”文件&#xff0c;选择“重命名”&#xff0c;将文件扩展名从.txt改为.reg&#xff0c;使其成为“vscode…

Chart.js 柱形图详解

Chart.js 柱形图详解 引言 在数据可视化领域&#xff0c;柱形图是一种非常常见的图表类型&#xff0c;它能够直观地展示不同类别或组的数据之间的比较。Chart.js 是一个基于 HTML5 Canvas 的开源库&#xff0c;它提供了一系列的图表绘制功能&#xff0c;其中包括柱形图。本文将…

沉浸式文旅新玩法-基于4D GS技术的真人数字人赋能VR体验升级

线下沉浸式剧场与 LBE VR 相结合&#xff0c;会碰撞出什么样的火花&#xff1f;本次 PICO 视频、东方演艺集团与火山引擎一起&#xff0c;将沉浸式演出《只此周庄》的部分场景复刻到了 VR 世界&#xff0c;让用户在虚拟的古代周庄夜市里&#xff0c;体验了古老的故事以及精彩纷…

C程序内存布局详解

C程序内存布局详解 1. 内存布局概述 C程序在内存中分为以下几个主要区域&#xff08;从低地址到高地址&#xff09;&#xff1a; 代码段&#xff08;.text&#xff09;只读数据段&#xff08;.rodata&#xff09;初始化数据段&#xff08;.data&#xff09;未初始化数据段&…

新手向:Git下载全攻略

Git 的安装与重要性在现代软件开发中&#xff0c;版本控制是必不可少的工具&#xff0c;而 Git 是目前最流行的分布式版本控制系统。无论是个人开发者还是大型团队&#xff0c;Git 都能高效管理代码变更&#xff0c;确保项目历史清晰可追溯。安装 Git 是开发者入门的第一步&…

linux中如何清除history命令

写在前面 使用ssh远程连接客户端连接上linux后操作的命令多了&#xff0c;有时候需要清除对应的历史命令记录&#xff0c;可以通过下面几种方式实现。第一种方法 通过修改.bash_history文件 这是最简单直接的方法&#xff0c;但是只会影响当前用户的历史记录。执行以下命令即可…

PHP插件开发中的一个错误:JSON直接输出导致网站首页异常

问题描述 最近在使用步数统计插件&#xff08;WeFootStep&#xff09;时&#xff0c;发现网站首页完全变成了一段JSON数据&#xff0c;而不是正常的HTML页面。具体表现为首页显示如下内容&#xff1a; {"results":"<li><a href\"https:\/\/blog…

落霞归雁的思维框架:十大经典思维工具的源头活水

在当今复杂多变的世界中&#xff0c;思维框架成为了解决问题、优化决策和提升效率的重要工具。提到思维框架&#xff0c;人们往往会想到那些被广泛认可和应用的十大经典思维工具&#xff1a;金字塔原理、黄金圈法则、5W1H分析法、SWOT分析、SCQA模型、STAR法则、PDCA循环、六顶…

spring Could 高频面试题

一、基础概念Spring Cloud 的核心组件有哪些&#xff1f; 答案&#xff1a;Eureka/Nacos&#xff08;服务注册发现&#xff09;、Ribbon/LoadBalancer&#xff08;负载均衡&#xff09;、Feign/OpenFeign&#xff08;声明式HTTP客户端&#xff09;、Hystrix/Sentinel&#xff0…