🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员
✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解
💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导
👏 感谢大家的订阅➕ 和 喜欢💗
📎在线评测链接
https://app5938.acapp.acwing.com.cn/contest/2/problem/OD1081
🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系清隆解锁~
🍓OJ题目截图
文章目录
- 📎在线评测链接
- 🍓OJ题目截图
- 🍓 LYA的登山之旅01
- 题目描述
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 样例解释
- 数据范围
- 题解
- 参考代码
🍓 LYA的登山之旅01
题目描述
LYA喜欢登山,她经常在地图上寻找各种山脉。地图可以表示为一个一维数组,数组的索引代表水平位置,数组的值代表该位置的海拔高度。其中,数组元素 0 0 0 代表地面。
例如,数组 a r r arr arr 表示如下图所示的地图,地图中有两个山脉,位置分别为 1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5 和 8 , 9 , 10 , 11 , 12 , 13 8,9,10,11,12,13 8,9,10,11,12,13,最高峰海拔分别为 4 4 4 和 3 3 3,最高峰位置分别为 3 3 3 和 10 10 10。
一个山脉可能有多个山峰(山峰的海拔高度大于相邻位置的海拔,或者位于地图边界且海拔高度大于相邻位置的海拔)。
4
+---+
| |
| |
| | 3 3
| +---+ +---+
| | | |
| | | |
2 | | 2 | | 2
+---+ | +---+ | +---+
| | | | | |
| | | | | |
1 | | 1 1 | | 1 | | 1
+---+ +---+ +---+ +---+ +---+
| | | |
| | | |
0 | | 0 0 | | 0
+---+ +---+---+ +---+
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
LYA想知道一张地图中有多少个山峰,你能帮助她计算出来吗?
输入格式
输入一行,为一个表示地图的数组,数组元素之间用逗号分隔,数组两端有方括号。
输出格式
输出一个整数,表示地图中山峰的数量。
样例输入
[0,1,4,3,1,0,0,1,2,3,1,2,1,0]
样例输出
3
样例解释
山峰所在的索引分别为 2 2 2, 10 10 10 和 12 12 12。
数据范围
1
≤
1 \leq
1≤ 数组长度
≤
1
0
5
\leq 10^5
≤105
0
≤
0 \leq
0≤ 数组元素
≤
1
0
9
\leq 10^9
≤109
题解
我们可以遍历数组,对于每个位置,判断它是否是山峰。一个位置是山峰,当且仅当它的海拔高度大于左右相邻位置的海拔高度(如果存在的话)。需要特别注意地图边界的处理。
参考代码
- Python
heights = list(map(int, input()[1:-1].split(',')))
n = len(heights)
ans = 0
for i in range(n):
left = i == 0 or heights[i] > heights[i - 1]
right = i == n - 1 or heights[i] > heights[i + 1]
if left and right:
ans += 1
print(ans)
- Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
s = s.substring(1, s.length() - 1);
String[] strs = s.split(",");
int[] w = new int[strs.length];
for (int i = 0; i < strs.length; i++) {
w[i] = Integer.parseInt(strs[i].trim());
}
int n = w.length;
int ans = 0;
for (int i = 0; i < n; i++) {
boolean left = i == 0 || w[i] > w[i - 1];
boolean right = i == n - 1 || w[i] > w[i + 1];
if (left && right) {
ans++;
}
}
System.out.println(ans);
}
}
- Cpp
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main() {
string input;
getline(cin, input);
input = input.substr(1, input.length() - 2);
stringstream ss(input);
string item;
vector<int> heights;
while (getline(ss, item, ',')) {
heights.push_back(stoi(item));
}
int n = heights.size();
int ans = 0;
for (int i = 0; i < n; i++) {
bool left = i == 0 || heights[i] > heights[i - 1];
bool right = i == n - 1 || heights[i] > heights[i + 1];
if (left && right) {
ans++;
}
}
cout << ans << endl;
return 0;
}