华为OD机试真题——天然蓄水库(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

article/2025/7/5 0:50:40

在这里插入图片描述

2025 A卷 200分 题型

本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!

2025华为OD真题目录+全流程解析/备考攻略/经验分享

华为OD机试真题《天然蓄水库》:


目录

    • 题目名称:天然蓄水库
      • 题目描述
      • 示例
    • Java
      • 题目分析
      • 解决思路
      • Java 代码实现
      • 代码详细解析
      • 综合分析
    • python
      • 题目分析
      • 解决思路
      • Python 代码实现
      • 代码详细解析
      • 关键逻辑图解
      • 综合分析
    • JavaScript
      • 题目分析
      • JavaScript 代码实现
      • 代码详细解析
      • 综合分析
      • 示例测试
        • 示例1:
        • 示例2:
      • 总结
    • C++
      • 解决思路
      • 代码实现
      • 关键步骤解析
      • 正确性验证
    • C语言
      • 解决思路
      • 代码实现
      • 代码详细解析
      • 复杂度与优化
      • 示例测试
    • GO
      • 题目分析
      • Go 代码实现
      • 代码详细解析
      • 示例验证
        • 输入1:
        • 输出1:
      • 时间复杂度与优化
      • 边界处理
      • 综合分析


题目名称:天然蓄水库


  • 知识点:双指针
  • 时间限制:1秒
  • 空间限制:256MB
  • 限定语言:不限

题目描述

公元2919年,人类在X星山脉间建造天然蓄水库,需选取两边界使蓄水量最大。要求:

  1. 山脉用数组s表示,元素为高度。
  2. 边界内的蓄水量为两边界高度的最小值减去中间山脉占用的空间。
  3. 若有多个解,选下标距离最近的边界。
  4. 无法蓄水则输出0,否则输出左、右边界及蓄水量。

输入描述
一行正整数(空格分隔),如 1 9 6 2 5 4 9 3 7,表示s = [1,9,6,2,5,4,9,3,7]

输出描述
若存在合理边界,输出格式为左边界 右边界:蓄水量,如1 6:19;否则输出0

示例

示例1
输入:

1 9 6 2 5 4 9 3 7  

输出:

1 6:19  

说明:选s[1](高9)和s[6](高9),中间蓄水量为3+7+4+5=19

示例2
输入:

3 2 1  

输出:

0  

补充说明

  • 数组长度范围:1 <= length(s) <= 10000
  • 山脉高度范围:0 <= s[i] <= 10000

Java

题目分析

题目要求在给定的山脉数组中选择两个边界,使得它们之间的蓄水量最大。蓄水量计算公式为:两边界高度的最小值 × 区间长度 - 中间山脉的总高度。需要处理以下关键点:

  1. 高效计算:避免暴力枚举所有可能的左右边界(O(n²) 时间复杂度),采用双指针法实现 O(n) 时间复杂度。
  2. 边界条件:处理无法蓄水的情况(结果 ≤ 0)和多个解时选择下标距离最近的边界。
  3. 数据预处理:使用前缀和数组快速计算中间山脉的总高度。

解决思路

  1. 双指针法:初始化左右指针分别指向数组首尾,每次移动较小高度的指针,保留较大高度的边界以探索更大蓄水量。
  2. 前缀和优化:预处理前缀和数组,实现区间和 O(1) 查询。
  3. 条件判断:维护最大蓄水量及对应的左右边界,处理距离更短的解。

Java 代码实现

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String[] parts = scanner.nextLine().trim().split(" ");int n = parts.length;int[] s = new int[n];for (int i = 0; i < n; i++) {s[i] = Integer.parseInt(parts[i]);}if (n < 2) {System.out.println(0);return;}// 预处理前缀和数组,preSum[i] 表示前i个元素的总和int[] preSum = new int[n + 1];for (int i = 0; i < n; i++) {preSum[i + 1] = preSum[i] + s[i];}int left = 0, right = n - 1;int maxWater = 0;int bestLeft = -1, bestRight = -1;while (left < right) {int minH = Math.min(s[left], s[right]);int count = right - left - 1;if (count > 0) { // 仅当区间内有元素时计算int sumMiddle = preSum[right] - preSum[left + 1];int water = minH * count - sumMiddle;// 更新最大值或更优解(距离更近)if (water > maxWater) {maxWater = water;bestLeft = left;bestRight = right;} else if (water == maxWater) {int currentDistance = right - left;int bestDistance = bestRight - bestLeft;if (currentDistance < bestDistance || bestDistance == -1) {bestLeft = left;bestRight = right;}}}// 移动较小高度的指针,保留较高边界if (s[left] < s[right]) {left++;} else {right--;}}// 输出结果if (maxWater <= 0) {System.out.println(0);} else {System.out.println(bestLeft + " " + bestRight + ":" + maxWater);}}
}

代码详细解析

  1. 输入处理

    • 读取输入并转换为整数数组 s
    • 处理长度为 1 的特殊情况(无法形成蓄水区间)。
  2. 前缀和数组

    • preSum[i] 表示前 i 个元素的总和,用于快速计算任意区间和。
  3. 双指针遍历

    • leftright 初始指向数组两端。
    • minH 计算当前左右边界的最小高度。
    • count 表示中间山脉的数量,sumMiddle 通过前缀和数组快速求得。
  4. 蓄水量计算

    • water = minH * count - sumMiddle 直接计算当前区间的蓄水量。
    • 维护 maxWater 和对应的最优边界 bestLeftbestRight
  5. 指针移动策略

    • 移动较小高度的指针,保留较高的边界以探索更大的蓄水量。
  6. 结果输出

    • 根据 maxWater 决定输出格式,处理无效解(结果 ≤ 0)。

综合分析

  1. 时间复杂度:双指针法将时间复杂度从 O(n²) 优化到 O(n),适用于大规模数据(n ≤ 10000)。
  2. 空间复杂度:仅需 O(n) 空间存储前缀和数组。
  3. 正确性保障
    • 前缀和数组确保区间和计算的快速和准确。
    • 指针移动策略保留较高边界,最大化后续探索的潜力。
    • 处理多个解时,优先选择下标距离更近的边界。

python

题目分析

题目要求在给定的山脉数组中选择两个边界,使得它们之间的蓄水量最大。蓄水量计算公式为:两边界高度的最小值 × 区间长度 - 中间山脉的总高度。需要处理以下关键点:

  1. 高效计算:避免暴力枚举所有可能的左右边界(O(n²) 时间复杂度),采用双指针法实现 O(n) 时间复杂度。
  2. 边界条件:处理无法蓄水的情况(结果 ≤ 0)和多个解时选择下标距离最近的边界。
  3. 数据预处理:使用前缀和数组快速计算中间山脉的总高度。

解决思路

  1. 双指针法:初始化左右指针分别指向数组首尾,每次移动较小高度的指针,保留较大高度的边界以探索更大蓄水量。
  2. 前缀和优化:预处理前缀和数组,实现区间和 O(1) 查询。
  3. 条件判断:维护最大蓄水量及对应的左右边界,处理距离更短的解。

Python 代码实现

def main():# 读取输入并转换为整数数组s = list(map(int, input().strip().split()))n = len(s)# 处理特殊情况:数组长度不足时无法形成蓄水区间if n < 2:print(0)return# 构建前缀和数组 pre_sum,pre_sum[i] 表示前i个元素的总和pre_sum = [0] * (n + 1)for i in range(n):pre_sum[i + 1] = pre_sum[i] + s[i]# 初始化双指针和最大值变量left, right = 0, n - 1max_water = 0best_left, best_right = -1, -1while left < right:# 当前左右边界的高度min_h = min(s[left], s[right])# 中间山脉的数量(区间长度为 right - left - 1)count = right - left - 1if count > 0:  # 仅当区间内有元素时计算蓄水量# 计算中间山脉的总高度:前缀和差法sum_middle = pre_sum[right] - pre_sum[left + 1]# 当前蓄水量 = 容器高度 × 区间长度 - 中间总高度current_water = min_h * count - sum_middle# 如果当前蓄水量更大,更新最大值和最优边界if current_water > max_water:max_water = current_waterbest_left, best_right = left, right# 如果蓄水量相同,但区间更短,则更新最优边界elif current_water == max_water:current_distance = right - leftbest_distance = best_right - best_leftif current_distance < best_distance or best_distance == -1:best_left, best_right = left, right# 移动指针策略:保留较高的边界,移动较矮的一边if s[left] < s[right]:left += 1</

http://www.hkcw.cn/article/WqoaWoqTIH.shtml

相关文章

基本数据指针的解读-C++

1、引言 笔者认为对于学习指针要弄清楚如下问题基本可以应付大部分的场景&#xff1a; ① 指针是什么&#xff1f; ② 指针的类型是什么&#xff1f; ③ 指针指向的类型是什么&#xff1f; ④ 指针指向了哪里&#xff1f; 2、如何使用指针 使用时的步骤如下&#xff1a; ① …

日志技术-LogBack、Logback快速入门、Logback配置文件、Logback日志级别

一. 日志技术 1. 程序中的日志&#xff0c;是用来记录应用程序的运行信息、状态信息、错误信息等。 2. JUL&#xff1a;(java.util.logging)这是JavaSE平台提供的官方日志框架&#xff0c;也被称为JUL。配置相对简单&#xff0c;但不够灵活&#xff0c;性能较差。 3.Logs4j&…

Nuxt多环境配置

前言 多环境配置对于特定环境新增、更新、删除配置相当重要&#x1f601;而且不需要人为去变更配置减少出错 实践 方案1&#xff08;官方推荐&#xff09; 升级依赖 升级Nuxt到最新版&#xff08;3.15.x只有开发和生产配置&#xff0c;不支持自定义环境&#xff09; npx n…

林志炫回应机能下降 唱功未减获支持

林志炫参加《歌手2025》,仅两期就被淘汰出局,成为第二位被淘汰的歌手。他在舞台上只唱了两首歌,却因此遭到质疑,很多人认为他的唱功严重下滑。尽管林志炫已年过半百,但他的唱功并未下降。林志炫在参加《我是歌手》期间曾透露,他非常注重嗓子的保养,平时饮食起居都会照顾…

这个中部大省 拼命“抢人” 系统性引才策略

又是一年毕业季。5月28日,长沙市青年人才创新创业政策推介活动在上海复旦大学举行,现场发布了长沙市青年人才创业“双肩包”行动计划,旨在为创业者提供从落地到上市的一条龙支持。这一行动背后是湖南省将大学生创业视为长远发展战略的一部分,通过系统性思维解决人才问题。不…

喜欢红帽子的马斯克 这次戴了黑帽子 DOGE成为“替罪羊”

美东时间5月30日,美国科技亿万富翁埃隆马斯克作为特朗普政府“特殊政府雇员”的任期结束。特朗普为他举行了一场在白宫椭圆形办公室的新闻发布会,并赠送了一把金色钥匙。马斯克戴着一顶印有“DOGE”字样的黑帽子参加了这场欢送会。在负责美国政府效率部(DOGE)运作的130天里…

联合国:全球住房危机影响近30亿人 亟需全球行动应对

当地时间5月29日至30日,第二届联合国人居大会续会在肯尼亚首都内罗毕召开。超过1000名代表参与会议,共同探讨全球住房危机,希望通过讨论、协作与政策规划来解决这一问题。联合国人类住区规划署执行主任阿纳克劳迪娅罗斯巴赫指出,据估计,全球有超过28亿人面临住房条件不达标…

拜登确诊癌症后首公开讲话:感觉很好 称病情发展良好

据美国广播公司和英国广播公司报道,自美国前总统拜登办公室5月18日宣布拜登被诊断患有侵袭性前列腺癌后,拜登于当地时间5月30日首次向记者发表公开讲话。他表示自己感觉很好。拜登说:“预计病情发展良好。我们正努力做好一切工作。一切都在进行中,所以我感觉很好。”他透露…

11月起新生产电池都将有“身份证” 实现全生命周期管控

为加强锂离子电池全生命周期的安全与质量管理,市场监管总局批准发布了《锂离子电池编码规则》国家标准,该标准将于2025年11月1日起实施。新标准赋予每个新生产的电池产品唯一身份编码,适用范围覆盖从单体电池到电池系统的全层级产品。通过“一池一码”可以实现从生产端到回收…

端午假期长江中下游有大暴雨 警惕次生灾害

端午假期期间,中东部地区将经历较大范围的降雨过程。长江中下游等地可能出现强降雨,部分地区甚至会有大暴雨,并伴有强对流天气。需警惕山体滑坡、泥石流等次生灾害。东北地区受冷空气影响将迎来降温,而华南多地则会出现高温,需注意防暑。昨天,中东部新一轮较大范围降雨过…

智慧港口电子通关系统引领智能化监管新时代

在全球贸易蓬勃发展的背景下&#xff0c;港口作为国际贸易的核心枢纽&#xff0c;其通关效率和监管能力直接影响物流链的顺畅运作。智慧港口电子通关系统&#xff08;智能闸口系统&#xff09;通过技术创新与数据融合&#xff0c;为海关监管和港口运营提供高效、精准、智能化的…

使用摄像头推流+VLC软件拉流

一、作用 使用摄像头创建rtsp链接&#xff0c;并使用VLC软件拉流显示。 二、步骤 1、安装FFmpeg库 下载地址&#xff1a;https://ffmpeg.org/download.htmlFFmpeg库的下载参考之前的博客&#xff0c;下载Win64版本即可&#xff1a;https://blog.csdn.net/beijixingcd/artic…

第8讲、Odoo 18 ORM 深度解析

文章目录 [toc] Odoo 18 ORM 深度解析&#x1f9e0; 一句话总结 Odoo ORM 原理&#x1f9f1; ORM 核心结构概览&#x1f504; ORM 生命周期与原理分析1️⃣ 模型定义&#xff08;Python class&#xff09;2️⃣ 模型注册&#xff08;MetaModel & Registry&#xff09;3️⃣…

网络编程套接字

目录 1.Socket套接字 1.1TCP和UDP的区别 2.UDP api的使用 2.1DatagramSocket 2.2DatagramPacket 3.UDP数据报套接字编程 3.1UdpEchoServer服务器 3.2UdpEchoClient客户端 3.3客户端和服务器相互配合的完整流程 4.TCP api的使用 4.1ServerSocket 4.2Socket 4.TCP数据…

秋招Day12 - 计算机网络 - TCP

详细说一下TCP的三次握手机制 TCP的三次握手机制是为了在两个主机之间建立可靠的连接&#xff0c;这个机制确保两端的通信是同步的&#xff0c;并且在开始传输数据前&#xff0c;双方都做好了要通信的准备。 说说SYN的概念&#xff1f; SYN 是 TCP 协议中用来建立连接的一个标…

前端pointer-events属性

1.如图 2.用法 使用pointer-events来阻止元素成为鼠标事件目标不一定意味着元素上的事件侦听器永远不会触发。如果元素后代明确指定了pointer-events属性并允许其成为鼠标事件的目标&#xff0c;那么指向该元素的任何事件在事件传播过程中都将通过父元素&#xff0c;并以适当的…

golang连接sm3认证加密(app)

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 文档用途 golang连接安全版sm3认证加密数据库,驱动程序详见附件。 详细信息 1.下载Linux golang安装包 go1.17.3.linux-amd64.tar.gz 1.1. 解压安…

PYTHON调用讯飞C/C++动态库实现离线语音合成并且实时播放

语音合成(Text-to-Speech, TTS)技术在现代应用中扮演着越来越重要的角色&#xff0c;从智能客服到有声读物&#xff0c;从导航系统到辅助工具&#xff0c;TTS技术无处不在。本文将详细介绍如何使用Python结合科大讯飞的离线SDK实现一个本地化的语音合成系统。 技术背景 离线语…

【Unity】模型渐变技术 BlendShapes变形

模型fbx拖拽到场景并赋予脚本上SkinnedMeshRenderer参数 按下空格即可演示渐变 可去到3DsMax 或 Blender等软件制作 这种带有BlendShapes的模型 (Sphere002)是另一个模型&#xff0c;3DsMax叫变形器。 可参考&#xff1a;【技术美术百人计划】美术 3.5 BlendShape基础_哔哩哔哩…

追觅高管批员工8点下班太早 引发加班争议

近日,社交媒体上流传一封追觅内部信。信中提到,许多深圳员工晚上不到20点就下班了,而总部那边22点后还有员工在办公室。管理者建议员工即使按时下班到家也应继续工作。信中还表示,行业内的普遍标准是员工创造的价值要达到公司雇佣成本的15倍以上,并以此质问员工是否达到了…