试题编号: | 201604-1 |
试题名称: | 折点计数 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述
给定n个整数表示一个商店连续n天的销售量。如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来如果之前销售量减少而后一天销售量增长,也称这一天为折点。其他的天都不是折点。如下图中,第3天和第6天是折点。
为了减少歧义,我们给定的数据保证:在这n天中相邻两天的销售量总是不同的,即a i -1≠a i。注意,如果两天不相邻,销售量可能相同。
输入格式
输入的第一行包含一个整数n。
第二行包含n个整数,用空格分隔,分别表示a 1, a 2, …, a n。
输出格式
输出一个整数,表示折点出现的数量。
样例输入
7
5 4 1 2 3 6 4
样例输出
2
评测用例规模与约定
所有评测用例满足:1 ≤ n ≤ 1000,每天的销售量是不超过10000的非负整数。
|
问题描述:先输入一个十进制整数n,再输入n个正整数,求它们相邻数之差可知是否为上升或下降,由上升转下降或由下降转上升为折点,求折点数。
问题分析:
方法一:如果一个点的值比左右两个都大或都小,则为折点。(较费存储空间)
方法二:顺序遍历,记录当前数和下一个数,并标记当前数列是递增还是递减,若当前是递增,下一个数比当前数小,即为拐点;若当前为递减序列,下一个数比当前数大,即为拐点。相较于方法一,较省空间,但程序逻辑性较强。
提交后得100分的Java语言程序如下:(方法一)(注意提交时去掉注释,否则容易引起编译错误)
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
int num = 0;
Scanner sc = new Scanner(System.in);
int n = Integer.valueOf(sc.nextLine());
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
for (int i = 1; i < n - 1; i++) {
if ((a[i - 1] > a[i] && a[i] < a[i + 1] )|| (a[i - 1] < a[i] && a[i] > a[i + 1]) ){
num++;
}
}
System.out.println(num);
sc.close();
}
}
提交后得100分的Java语言程序如下:(方法二)(注意提交时去掉注释,否则容易引起编译错误)
public class Main {
public static void main(String[] args) {
int n;
int pre = -1;// 前一个数
int aft = -1;// 后一个数
int pre_state = 0;// 标定上一次的状态-1表示递减 1表示递加
int now_state = 0;// 标定本次的状态-1表示递减 1表示递加
int num = 0;// 折点个数
Scanner sc = new Scanner(System.in);
n = Integer.valueOf(sc.nextLine());
for (int i = 0; i < n; i++) {
if (pre == -1) {
pre = sc.nextInt();
} else if (aft == -1) {
aft = sc.nextInt();
if (aft - pre > 0) {
pre_state = 1;
} else {
pre_state = -1;
}
pre = aft;// 记录变化
} else {
aft = sc.nextInt();
if (aft - pre > 0) {
now_state = 1;
} else {
now_state = -1;
}
if (now_state != pre_state) {
num++;
pre_state = now_state;
}
pre = aft;// 记录变化
}
}
System.out.println(num);
sc.close();
}
}