《算法笔记》4.5 配套练习题 打印极值点下标

《算法笔记》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();  //输出换行,否则什么也不输出
            }
            
        }
        
        
    }

}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wyypersist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值