接雨水问题 + 输入优化

大雨过后,一些高低不平的地方就会形成积水,俗称为"坑"。这里我们将问题简化为只考虑一段路面的横截面。我们将这一段截面上的土地分割成单位宽度的窄条,测量出每个窄条的高度。假设有无穷多的水量从天而降,请你计算一下,这段路面上会形成多少个水坑?坑的最大深度是多少毫米?

顺便祝大家新年少踩坑!

输入格式:

输入第一行给出一个正整数 N(≤105)。随后一行给出 N 个非负整数,为路面横截面总左到右的单位宽度窄条的高度,以毫米为单位,不超过 1000。

输出格式:

输出分两行,第一行输出水坑的个数,第二行输出所有水坑中最大的深度,以毫米为单位。

注意:即使两个相邻的水坑有相同高度的水平面,只要之间有窄条相隔,就算是两个水坑。

输入样例:

12

1 4 2 10 7 1 2 1 8 3 1 2

输出样例:

3

7

样例说明:

下图给出了样例中得到的水坑示意图。

import java.io.*;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

import java.util.StringTokenizer;

public class Main {

public static void main(String\[\] args) throws IOException {

InputStream in = System.in;

int n = readInt(in);

int\[\] arr = new intn;

for (int i = 0; i < n; i++) {

arri = readInt(in);

}

int\[\] leftmax = new intn;

leftmax0 = arr0;

for (int i = 1; i <n ; i++) {

leftmaxi = Math.max(leftmaxi - 1 , arri);

}

int\[\] rigmax = new intn;

rigmaxn - 1 = arrn - 1;

for (int i = n - 2; i >= 0 ; i--) {

rigmaxi = Math.max(rigmaxi + 1 , arri);

}

int dep = 0;

int con = 0;

for (int i = 1; i < n - 1 ; i++) {

int tmp = Math.min(leftmaxi , rigmaxi) - arri;

dep = Math.max(dep , tmp);

if(Math.min(leftmaxi - 1 , rigmaxi - 1) - arri - 1 == 0 && Math.min(leftmaxi , rigmaxi) - arri != 0)

con++;

}

System.out.println(con);

System.out.println(dep);

}

static int readInt(InputStream in) throws IOException{

int c = 0;

int x = 0;

while((c = in.read()) < '0')

;

do {

x = x * 10 + c - '0';

}

while ((c = in.read()) >= '0');

return x;

}

}

readIntBufferedReader 快的本质是:它砍掉了所有 "无用的封装",只做 "读数字" 这一件事,而 BufferedReader 是通用型工具,自带大量冗余逻辑

为什么快?

少了「字符串解析」的额外开销

BufferedReader 读取数字的常规写法是:

java

运行

复制代码
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine(); // 先读成字符串
int num = Integer.parseInt(line); // 再转成整数
  • 第一步:把字节流 → 字符串(要处理编码、拼接字符);
  • 第二步:把字符串 → 整数(要校验格式、逐字符转数字)。

而你的 readInt 是:

java

运行

复制代码
// 直接从字节流 → 整数,跳过"字符串"中间层
do {
    x = x * 10 + c - '0'; // 字节直接转数字,一步到位
} while ((c = in.read()) >= '0');

✅ 少了「字符串创建 + 解析」,这是最大的提速点

相关推荐
晴空了无痕9 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫9 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通10 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
AC赳赳老秦11 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
AI多Agent协作实战派11 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug
gaolei_eit11 小时前
Java+Ai+vue
java·spring·maven
qq_25183645711 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
野生风长11 小时前
C++入门基础:从命名空间到引用与指针的全面解析
开发语言·c++
LayZhangStrive11 小时前
JUC相关的函数、注解、变量杂记
java·面试·多线程·juc
未秃头的程序猿11 小时前
给公司做了个AI客服Agent,用的Spring AI 1.0,3天上线领导拍板了
java·后端·ai编程