P1567 统计天数

题目描述

炎热的夏日,KC 非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。
经历千辛万苦,他收集了连续 N(1 ≤ N≤ 10^6) 的最高气温数据。
现在,他想知道最高气温一直上升的最长连续天数。

输入格式

第 1 行:一个整数 N 。1≤N≤10^6
第 2 行:N个空格隔开的整数,表示连续 N 天的最高气温。0 ≤ 最高气温 ≤10^9。

输出格式

1 行:一个整数,表示最高气温一直上升的最长连续天数。

输入输出样例

输入 #1

1
2
10
1 2 3 2 4 5 6 8 5 9

输出 #1

1
5

分析

  1. 使用数组存储气温数据,提交后有5组测试点 Memory Limit Exceeded.

  2. 使用变量a,b不使用数组存储,提交后依然是 Memory Limit Exceeded.

  3. 查询题解,发现不应该用Scanner,应该用流,效率更高

    1. 使用StreamTokenizer

      1
      2
      3
      StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
      sc.nextToken();//nextToken方法读取下一个Token.
      int n = (int) sc.nval;

      StreamTokenizer可以获取输入流并将其分析为Token, Streamtokenizer按字符来读取字符流。每个字符流可以有零个或多个:空白字符、字母、数字、字符串引用或注释符号。

      1. 使用BufferedReader
        1
        2
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        reader.readLine();//读入N,并不使用,下面使用temp.length代替

Reader和Scanner总结

  • Java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串。它本质上是使用正则表达式去读取不同的数据类型
  • Java.io.BufferedReader类为了能够高效的读取字符序列,从字符输入流和字符缓冲区读取文本。
  • BufferedReader是支持同步的,而Scanner不支持。BufferedReader的read函数都加了synchronized关键字
  • BufferedReader的缓冲区大小为8KB,Scanner的缓冲区大小为1KB
  • BufferedReader相对于Scanner来说要快一点,因为Scanner对输入数据进行正则解析,而BufferedReader只是简单地读取字符序列

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Scanner;

public class Main {

public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
reader.readLine();//读入N,并不使用,下面使用temp.length代替
String[] temp = reader.readLine().split(" ");
int maxDay = 0;
int t = 1;
for (int i = 1; i < temp.length; i++) {
//应使用parseInt而不是valueOf,避免比较时自动拆箱
if (Integer.parseInt(temp[i]) > Integer.parseInt(temp[i - 1])) {
t++;
} else {
if (t > maxDay) {
maxDay = t;
}
t = 1;
}
}
System.out.println(maxDay);
}

}

P1567 统计天数