【2024年华为OD机试】(C卷,100分)- 攀登者1 (Java JS PythonC/C++)

在这里插入图片描述

一、问题描述

题目描述

攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。

地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。
在这里插入图片描述

例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5 和 8,9,10,11,12,13,最高峰高度分别为 4,3。最高峰位置分别为3,10。

一个山脉可能有多座山峰(高度大于相邻位置的高度,或在地图边界且高度大于相邻的高度)。

登山者想要知道一张地图中有多少座山峰。

输入描述

输入为一个整型数组,数组长度大于1。

输出描述

输出地图中山峰的数量。

用例

输入

0,1,4,3,1,0,0,1,2,3,1,2,1,0

输出

3

说明
山峰所在索引分别为3,10,12

题目解析

本题考试时为核心代码模式,非ACM模式,即无需自己解析输入数据。

本题代码实现仍然以ACM模式处理,但是会将输入处理与算法逻辑分开,大家只看算法逻辑即可。

问题分析

要解决这个问题,我们需要遍历数组,找到所有符合条件的山峰。一个位置被认为是山峰,如果它满足以下条件之一:

  1. 该位置在数组的边界,并且其高度大于相邻位置的高度。
  2. 该位置不在数组的边界,并且其高度大于两侧相邻位置的高度。
算法逻辑
  1. 初始化计数器:设置一个计数器 peak_count 用于记录山峰的数量,初始值为0。
  2. 遍历数组:从数组的第一个元素开始遍历到倒数第二个元素(因为最后一个元素单独处理)。
    • 对于每个元素,检查它是否大于其左侧和右侧的元素。如果是,则这是一个山峰,增加 peak_count
  3. 处理边界条件
    • 检查数组的第一个元素是否大于第二个元素。如果是,第一个元素是一个山峰。
    • 检查数组的最后一个元素是否大于倒数第二个元素。如果是,最后一个元素是一个山峰。
  4. 输出结果:遍历完成后,输出 peak_count 作为结果。

通过这种方法,我们可以有效地找到数组中所有的山峰,并计算它们的数量。这种方法的时间复杂度是 O(n),其中 n 是数组的长度,因为我们只需要遍历数组一次。

二、JavaScript算法源码

以下是 JavaScript 代码的详细中文注释和讲解:


JavaScript 代码

// 引入 readline 模块,用于从标准输入读取数据
const rl = require("readline").createInterface({ input: process.stdin });// 获取异步迭代器,用于逐行读取输入
var iter = rl[Symbol.asyncIterator]();// 定义异步函数 readline,用于读取一行输入
const readline = async () => (await iter.next()).value;// 输入处理
void (async function () {// 读取输入的一行数据,按逗号分割并转换为数字数组const heights = (await readline()).split(",").map(Number);// 调用算法函数 getResult,并输出结果console.log(getResult(heights));
})();/*** 算法实现:统计数组中峰值的数量* @param {number[]} heights - 输入的高度数组* @returns {number} - 峰值的数量*/
function getResult(heights) {let count = 0; // 初始化计数器,用于统计峰值的数量// 遍历数组中的每个元素for (let i = 0; i < heights.length; i++) {// 获取当前元素的左侧高度,如果左侧没有元素则默认为 0const leftHeight = i - 1 >= 0 ? heights[i - 1] : 0;// 获取当前元素的右侧高度,如果右侧没有元素则默认为 0const rightHeight = i + 1 < heights.length ? heights[i + 1] : 0;// 判断当前元素是否为峰值if (heights[i] > leftHeight && heights[i] > rightHeight) {count++; // 如果是峰值,计数器加 1}}// 返回峰值的数量return count;
}

代码讲解

1. 输入处理
  • readline 模块
    • 用于从标准输入逐行读取数据。
    • rl[Symbol.asyncIterator]() 获取异步迭代器,用于逐行读取输入。
  • readline 函数
    • 异步函数,用于读取一行输入。
  • 输入处理逻辑
    • 读取一行输入,按逗号 , 分割成字符串数组。
    • 使用 map(Number) 将字符串数组转换为数字数组 heights
2. 算法实现
  • getResult 函数
    • 参数 heights 是输入的高度数组。
    • 初始化计数器 count,用于统计峰值的数量。
    • 遍历数组中的每个元素:
      • 获取当前元素的左侧高度 leftHeight,如果左侧没有元素则默认为 0
      • 获取当前元素的右侧高度 rightHeight,如果右侧没有元素则默认为 0
      • 判断当前元素是否为峰值:
        • 如果当前元素大于左侧元素且大于右侧元素,则认为是峰值,计数器 count 加 1。
    • 返回峰值的数量 count
3. 输出结果
  • 使用 console.log 输出峰值的数量。

示例运行

输入 1
1,2,3,2,1
  • 输出
    1
    
  • 解释
    • 数组为 [1, 2, 3, 2, 1]
    • 只有 3 是峰值(大于左侧的 2 和右侧的 2)。
    • 峰值的数量为 1
输入 2
1,2,1,3,5,6,4
  • 输出
    2
    
  • 解释
    • 数组为 [1, 2, 1, 3, 5, 6, 4]
    • 峰值有 2(大于左侧的 1 和右侧的 1)和 6(大于左侧的 5 和右侧的 4)。
    • 峰值的数量为 2

总结

  • 该代码实现了 统计数组中峰值的数量 的功能。
  • 通过遍历数组,判断每个元素是否大于其左右两侧的元素,从而确定是否为峰值。
  • 时间复杂度为 O(n),其中 n 是数组的长度。
  • 如果有其他问题,欢迎继续提问!

三、Java算法源码

以下是 Java 代码的详细中文注释和讲解:


Java 代码

import java.util.Arrays; // 导入 Arrays 工具类,用于数组操作
import java.util.Scanner; // 导入 Scanner 类,用于读取输入public class Main {// 输入处理public static void main(String[] args) {// 创建 Scanner 对象,用于从标准输入读取数据Scanner sc = new Scanner(System.in);// 读取一行输入,按逗号分割成字符串数组,并转换为整数数组int[] heights = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();// 调用算法函数 getResult,并输出结果System.out.println(getResult(heights));}/*** 算法实现:统计数组中峰值的数量* @param heights - 输入的高度数组* @return 峰值的数量*/public static int getResult(int[] heights) {int count = 0; // 初始化计数器,用于统计峰值的数量// 遍历数组中的每个元素for (int i = 0; i < heights.length; i++) {// 获取当前元素的左侧高度,如果左侧没有元素则默认为 0int leftHeight = i - 1 >= 0 ? heights[i - 1] : 0;// 获取当前元素的右侧高度,如果右侧没有元素则默认为 0int rightHeight = i + 1 < heights.length ? heights[i + 1] : 0;// 判断当前元素是否为峰值if (heights[i] > leftHeight && heights[i] > rightHeight) {count++; // 如果是峰值,计数器加 1}}// 返回峰值的数量return count;}
}

代码讲解

1. 输入处理
  • Scanner
    • 用于从标准输入读取数据。
    • sc.nextLine() 读取一行输入。
  • Arrays.stream
    • 将输入的字符串按逗号 , 分割成字符串数组。
    • 使用 mapToInt(Integer::parseInt) 将字符串数组转换为整数数组。
    • 使用 toArray() 将流转换为整数数组 heights
2. 算法实现
  • getResult 函数
    • 参数 heights 是输入的高度数组。
    • 初始化计数器 count,用于统计峰值的数量。
    • 遍历数组中的每个元素:
      • 获取当前元素的左侧高度 leftHeight,如果左侧没有元素则默认为 0
      • 获取当前元素的右侧高度 rightHeight,如果右侧没有元素则默认为 0
      • 判断当前元素是否为峰值:
        • 如果当前元素大于左侧元素且大于右侧元素,则认为是峰值,计数器 count 加 1。
    • 返回峰值的数量 count
3. 输出结果
  • 使用 System.out.println 输出峰值的数量。

示例运行

输入 1
1,2,3,2,1
  • 输出
    1
    
  • 解释
    • 数组为 [1, 2, 3, 2, 1]
    • 只有 3 是峰值(大于左侧的 2 和右侧的 2)。
    • 峰值的数量为 1
输入 2
1,2,1,3,5,6,4
  • 输出
    2
    
  • 解释
    • 数组为 [1, 2, 1, 3, 5, 6, 4]
    • 峰值有 2(大于左侧的 1 和右侧的 1)和 6(大于左侧的 5 和右侧的 4)。
    • 峰值的数量为 2

总结

  • 该代码实现了 统计数组中峰值的数量 的功能。
  • 通过遍历数组,判断每个元素是否大于其左右两侧的元素,从而确定是否为峰值。
  • 时间复杂度为 O(n),其中 n 是数组的长度。
  • 如果有其他问题,欢迎继续提问!

四、Python算法源码

以下是 Python 代码的详细中文注释和讲解:


Python 代码

# 输入获取
# 从标准输入读取一行数据,按逗号分割并转换为整数列表
heights = list(map(int, input().split(",")))# 算法入口(本题实际考试为核心代码模式,因此考试时只需要写出此函数实现即可)
def getResult(h):count = 0  # 初始化计数器,用于统计峰值的数量# 遍历列表中的每个元素for i in range(len(h)):# 获取当前元素的左侧高度,如果左侧没有元素则默认为 0leftH = h[i - 1] if i - 1 >= 0 else 0# 获取当前元素的右侧高度,如果右侧没有元素则默认为 0rightH = h[i + 1] if i + 1 < len(h) else 0# 判断当前元素是否为峰值if h[i] > leftH and h[i] > rightH:count += 1  # 如果是峰值,计数器加 1# 返回峰值的数量return count# 算法调用
print(getResult(heights))

代码讲解

1. 输入处理
  • input() 函数
    • 从标准输入读取一行数据。
  • split(",")
    • 将输入的字符串按逗号 , 分割成字符串列表。
  • map(int, ...)
    • 将字符串列表中的每个元素转换为整数。
  • list(...)
    • 将转换后的结果转换为整数列表 heights
2. 算法实现
  • getResult 函数
    • 参数 h 是输入的高度列表。
    • 初始化计数器 count,用于统计峰值的数量。
    • 遍历列表中的每个元素:
      • 获取当前元素的左侧高度 leftH,如果左侧没有元素则默认为 0
      • 获取当前元素的右侧高度 rightH,如果右侧没有元素则默认为 0
      • 判断当前元素是否为峰值:
        • 如果当前元素大于左侧元素且大于右侧元素,则认为是峰值,计数器 count 加 1。
    • 返回峰值的数量 count
3. 输出结果
  • 使用 print 函数输出峰值的数量。

示例运行

输入 1
1,2,3,2,1
  • 输出
    1
    
  • 解释
    • 列表为 [1, 2, 3, 2, 1]
    • 只有 3 是峰值(大于左侧的 2 和右侧的 2)。
    • 峰值的数量为 1
输入 2
1,2,1,3,5,6,4
  • 输出
    2
    
  • 解释
    • 列表为 [1, 2, 1, 3, 5, 6, 4]
    • 峰值有 2(大于左侧的 1 和右侧的 1)和 6(大于左侧的 5 和右侧的 4)。
    • 峰值的数量为 2

总结

  • 该代码实现了 统计列表中峰值的数量 的功能。
  • 通过遍历列表,判断每个元素是否大于其左右两侧的元素,从而确定是否为峰值。
  • 时间复杂度为 O(n),其中 n 是列表的长度。
  • 如果有其他问题,欢迎继续提问!

五、C/C++算法源码:

以下是 C 语言 代码的详细中文注释和讲解:


C 语言代码

#include <stdio.h>#define MAX_SIZE 100000  // 定义数组的最大长度// 算法实现(本题实际考试为核心代码模式,因此考试时只需要写出此函数实现即可)
int getResult(const int heights[], int heights_size) {int count = 0;  // 初始化计数器,用于统计峰值的数量// 遍历数组中的每个元素for (int i = 0; i < heights_size; i++) {// 获取当前元素的左侧高度,如果左侧没有元素则默认为 0int leftHeight = i - 1 >= 0 ? heights[i - 1] : 0;// 获取当前元素的右侧高度,如果右侧没有元素则默认为 0int rightHeight = i + 1 < heights_size ? heights[i + 1] : 0;// 判断当前元素是否为峰值if (heights[i] > leftHeight && heights[i] > rightHeight) {count++;  // 如果是峰值,计数器加 1}}// 返回峰值的数量return count;
}// 输入处理
int main() {int heights[MAX_SIZE];  // 定义数组,用于存储输入的高度数据int heights_size = 0;   // 初始化数组的长度为 0// 循环读取输入数据,直到遇到非逗号分隔符(如换行符)while (scanf("%d", &heights[heights_size++])) {if (getchar() != ',') break;  // 如果下一个字符不是逗号,则结束输入}// 调用算法函数 getResult,并输出结果printf("%d\n", getResult(heights, heights_size));return 0;
}

代码讲解

1. 输入处理
  • heights[MAX_SIZE]
    • 定义一个数组 heights,用于存储输入的高度数据。
    • MAX_SIZE 是数组的最大长度,定义为 100000
  • heights_size
    • 记录数组的实际长度,初始值为 0
  • while (scanf("%d", &heights[heights_size++]))
    • 使用 scanf 读取整数并存储到数组 heights 中。
    • 每次读取一个整数后,数组长度 heights_size 加 1。
  • if (getchar() != ',') break;
    • 使用 getchar 读取下一个字符。
    • 如果下一个字符不是逗号 ,,则结束输入。
2. 算法实现
  • getResult 函数
    • 参数 heights 是输入的高度数组。
    • 参数 heights_size 是数组的长度。
    • 初始化计数器 count,用于统计峰值的数量。
    • 遍历数组中的每个元素:
      • 获取当前元素的左侧高度 leftHeight,如果左侧没有元素则默认为 0
      • 获取当前元素的右侧高度 rightHeight,如果右侧没有元素则默认为 0
      • 判断当前元素是否为峰值:
        • 如果当前元素大于左侧元素且大于右侧元素,则认为是峰值,计数器 count 加 1。
    • 返回峰值的数量 count
3. 输出结果
  • 使用 printf 函数输出峰值的数量。

示例运行

输入 1
1,2,3,2,1
  • 输出
    1
    
  • 解释
    • 数组为 [1, 2, 3, 2, 1]
    • 只有 3 是峰值(大于左侧的 2 和右侧的 2)。
    • 峰值的数量为 1
输入 2
1,2,1,3,5,6,4
  • 输出
    2
    
  • 解释
    • 数组为 [1, 2, 1, 3, 5, 6, 4]
    • 峰值有 2(大于左侧的 1 和右侧的 1)和 6(大于左侧的 5 和右侧的 4)。
    • 峰值的数量为 2

总结

  • 该代码实现了 统计数组中峰值的数量 的功能。
  • 通过遍历数组,判断每个元素是否大于其左右两侧的元素,从而确定是否为峰值。
  • 时间复杂度为 O(n),其中 n 是数组的长度。
  • 如果有其他问题,欢迎继续提问!

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

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

相关文章

day06_Spark SQL

文章目录 day06_Spark SQL课程笔记一、今日课程内容二、DataFrame详解&#xff08;掌握&#xff09;5.清洗相关的API6.Spark SQL的Shuffle分区设置7.数据写出操作写出到文件写出到数据库 三、Spark SQL的综合案例&#xff08;掌握&#xff09;1、常见DSL代码整理2、电影分析案例…

Copula算法原理和R语言股市收益率相依性可视化分析

阅读全文&#xff1a;http://tecdat.cn/?p6193 copula是将多变量分布函数与其边缘分布函数耦合的函数&#xff0c;通常称为边缘。在本视频中&#xff0c;我们通过可视化的方式直观地介绍了Copula函数&#xff0c;并通过R软件应用于金融时间序列数据来理解它&#xff08;点击文…

Spring Boot 支持哪些日志框架

Spring Boot 支持多种日志框架&#xff0c;主要包括以下几种&#xff1a; SLF4J (Simple Logging Facade for Java) Logback&#xff08;默认&#xff09;Log4j 2Java Util Logging (JUL) 其中&#xff0c;Spring Boot 默认使用 SLF4J 和 Logback 作为日志框架。如果你需要使…

OpenCV基础:视频的采集、读取与录制

从摄像头采集视频 相关接口 - VideoCapture VideoCapture 用于从视频文件、摄像头或其他视频流设备中读取视频帧。它可以捕捉来自多种源的视频。 主要参数&#xff1a; cv2.VideoCapture(source): source: 这是一个整数或字符串&#xff0c;表示视频的来源。 如果是整数&a…

Uniapp仿ChatGPT Stream流式输出(非Websocket)

Uniapp仿ChatGPT Stream流式输出&#xff08;非Websocket&#xff09; 前言&#xff1a;流式输出可以使用websocket也可以使用stream来实现EventSource是 HTML5 中的一个接口&#xff0c;用于接收服务器发送的事件流&#xff08;Server - Sent Events&#xff0c;SSE&#xff…

《自动驾驶与机器人中的SLAM技术》ch2:基础数学知识

目录 2.1 几何学 向量的内积和外积 旋转矩阵 旋转向量 四元数 李群和李代数 SO(3)上的 BCH 线性近似式 2.2 运动学 李群视角下的运动学 SO(3) t 上的运动学 线速度和加速度 扰动模型和雅可比矩阵 典型算例&#xff1a;对向量进行旋转 典型算例&#xff1a;旋转的复合 2.3 …

深入 Flutter 和 Compose 在 UI 渲染刷新时 Diff 实现对比

众所周知&#xff0c;不管是什么框架&#xff0c;在前端 UI 渲染时&#xff0c;都会有构造出一套相关的渲染树&#xff0c;并且在 UI 更新时&#xff0c;为了尽可能提高性能&#xff0c;一般都只会进行「差异化」更新&#xff0c;而不是对整个 UI Tree 进行刷新&#xff0c;所以…

Elasticsearch—索引库操作(增删查改)

Elasticsearch中Index就相当于MySQL中的数据库表 Mapping映射就类似表的结构。 因此我们想要向Elasticsearch中存储数据,必须先创建Index和Mapping 1. Mapping映射属性 Mapping是对索引库中文档的约束&#xff0c;常见的Mapping属性包括&#xff1a; type&#xff1a;字段数据类…

occ的开发框架

occ的开发框架 1.Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). It provides basic documentation on using OCAF. 2.Purpose of OCAF OCAF (the Open CASCADE Application Framework) is an easy-to-use platform for ra…

esp32在编译是报错在idf中有该文件,但是说没有

报错没有头文件esp_efuse_table.h D:/Espressif/frameworks/esp-idf-v5.3.1/components/driver/deprecated/driver/i2s.h:27:2: warning: #warning "This set of I2S APIs has been deprecated, please include driver/i2s_std.h, driver/i2s_pdm.h or driver/i2s_tdm.h …

git - 用SSH方式迁出远端git库

文章目录 git - 用SSH方式迁出远端git库概述笔记以gitee为例产生RSA密钥对 备注githubEND git - 用SSH方式迁出远端git库 概述 最近一段时间&#xff0c;在网络没问题的情况下&#xff0c;用git方式直接迁出git库总是会失败。 失败都是在远端, 显示RPC错误。 但是git服务器端…

http和https有哪些不同

http和https有哪些不同 1.数据传输的安全性&#xff1a;http非加密&#xff0c;https加密 2.端口号&#xff1a;http默认80端口&#xff0c;https默认443端口 3.性能&#xff1a;http基于tcp三次握手建立连接&#xff0c;https在tcp三次握手后还有TLS协议的四次握手确认加密…

超详细-java-uniapp小程序-引导关注公众号、判断用户是否关注公众号

目录 1、前期准备 公众号和小程序相互关联 准备公众号文章 注册公众号测试号 微信静默授权的独立html 文件 2&#xff1a; 小程序代码 webview页面代码 小程序首页代码 3&#xff1a;后端代码 1&#xff1a;增加公众号配置项 2&#xff1a;读取公众号配置项 3&…

【Python进阶——分布式计算框架pyspark】

Apache Spark是用于大规模数据处理的统一分析引擎 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算TB、PB乃至EB级别的海量数据&#xff0c;Spark作为全球顶级的分布式计算框架&#xff0c;支持众多的编程语言进行开…

基于 FastExcel 与消息队列高效生成及导入机构用户数据

&#x1f3af; 本文档详细介绍了开发机构用户数据导入功能的必要性及实现方法&#xff0c;如针对教育机构如学校场景下提高用户体验和管理效率的需求。文中首先分析了直接对接学生管理系统与平台对接的优势&#xff0c;包括减少人工审核成本、提高身份验证准确性等。接着介绍了…

校园跑腿小程序---轮播图,导航栏开发

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…

前端练习题

图片&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>用户信息页面</title><style>body {font-family: Arial, sans-serif;margin: 20px;}.user-info {display: flex;align-it…

AllData是怎么样的一款数据中台产品?

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨奥零数据科技官网&#xff1a;…

一学就废|Python基础碎片,OS模块

Python 中的操作系统模块提供了与操作系统交互的功能。操作系统属于 Python 的标准实用程序模块。该模块提供了一种使用依赖于操作系统的功能的可移植方式。os和os. path模块包括许多与文件系统交互的函数。 Python-OS 模块函数 我们将讨论 Python os 模块的一些重要功能&…

2.Numpy练习(1)

一.练习一&#xff1a; 1.打印当前numpy版本&#xff1a; 2.构造一个全零的矩阵&#xff0c;并打印其占用内存大小&#xff1a; 3.打印一个函数的帮助文档&#xff0c;比如numpy.add&#xff1a; 4.创建一个10~49数组&#xff0c;并将其倒序排列: 5.找到一个数组中不为0的索引…