《算法笔记》4.5配套练习题
题目:打印极值点下标
题目要求
题目描述
在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数,或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。
输入
每个案例的输入如下:
有2×n+1行输入:第一行是要处理的数组的个数n;
对其余2×n行,第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。
输出
每个案例输出不多于n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔,如果没有极值点则不输出任何东西。
样例输入 Copy
2 4 1 2 1 3 5 3 4 5 6 7
样例输出 Copy
0 1 2 3 0 4
java代码实现:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//定义一个保存数据组数的变量
int n = 0;
Scanner sc = new Scanner (System.in);
n = sc.nextInt();
for(int i = 0;i < n;i ++) { //for循环实现多组数据输入和结果输出
//定义一个flag变量来控制空格的输出
boolean flag = false;
int currN = 0; //定义本次需要输入的个数
currN = sc.nextInt();
//定义一个保存数组
int k [] = new int[currN];
//内部for循环得到用户输入数字
for(int j = 0;j < currN ; j ++) {
k[j] = sc.nextInt();
}
//设置的记载上一个数字的变量
int lastNum = k[0];
if(k[0] != k[1]) { //对第一个数字的判断
System.out.print(0); //表示此时第一个元素是极值点
flag = true;
}
//找到本次对应的极值点(使用for循环实现判断)
//表示从第2个元素开始判断
for(int j = 1;j < currN - 1;j ++) {
if(((k[j] < k[j - 1] && k[j] < k[j + 1]) || (k[j] > k[j - 1] && k[j] > k[j + 1])) && flag) {
System.out.print(" " + j); //表示当前下标是极值点
}else if((k[j] < k[j - 1] && k[j] < k[j + 1]) || (k[j] > k[j - 1] && k[j] > k[j + 1])){
System.out.print(j);
//及时更改flag的值,表示有极值输出
flag = true;
}else {
continue;
}
}
//对于最后一个数字有
if(k[currN - 1] != k[currN - 2]) { //此时最后一个也符合题意
if(flag) { //表示之前有数据输出了,那么需要在输出本元素之前先输出一个空格
System.out.print(" " + (currN - 1));
flag = true;
}else {
System.out.print(currN - 1);
}
}
//表示有极值输出
if(flag) {
System.out.println(); //输出换行,否则什么也不输出
}
}
}
}