Java ----- 求一维数组的所有局部最高点

Java 求一维数组的所有局部最高点

原题是这样的:

  • 编写程序,寻找数组中的局部最高点。
  • 局部最高点的定义如下:
  • 在1维数组中,如果一个数大于或等于左右两边相邻的数,则称- -维局部最高点。其中边界外值为 ±∞,即最左边和最右边只需大于临近的一个元素。

这原本是一个python的题目,但是没学过,这里就用Java来随便做做了~~~
这里说一下“String[] strs = scanner.nextLine().split(" ");”这一行代码,这里必须要用nextLine(),因为这个是以enter(回车)为结束的,而next()则是以" "(空格)结束,这儿又要以空格进行分割,所以不能用next()虽然两者都是String类型的。

还有就是循环部分的跳着判断那里,可以根据你的循环遍历方向,往左就判断左相邻数进行往左的跳过判断,往又就是我程序的那样。其实还可以以数组中点开始,往两边进行判断,左边左跳,右边右跳,这样能减少循环次数,但是每次循环执行的代码块又增多了,具体的相率能否提高,由于自己的计算复杂度的知识缺乏,也不知道,就不再做了,这里奉上想法。不过可以减少某些偶然性引起的问题,比如恰好局部最高点较少,不是最高点的都是小于右相邻数,大于左相邻数,这样通过右跳判断几乎就和判断完整个数组无异了。归根到底这种减少次数提高效率具有一定的偶然性,运气不好就和遍历数组判断一样的。

其余的源码注释已经足够详细,所以这里就不再多说了。如实在有不明白的,可联系我:qq:2530318393,或者留言。
另外:写作不易,转载请声明所属~~~~~~~~
/**
 * @program: 求数组局部最高点
 * @description: 数组局部最高点实验程序入口
 * @author: Mr.XiaoShi
 * @create: 2020-09-05 18:53
 **/

import java.util.Scanner;

/**
 * 编写程序,寻找数组中的局部最高点。
 * 局部最高点的定义如下:
 * 在1维数组中,如果一个数大于或等于左右两边相邻的数,则称- -维局部最高点。其中边界外值为 ±∞,即最左边和最右边只需大于临近的一个元素。
 * 我这里找的是数组所有的最高点,所以肯定要把数组进行遍历一遍进行判断,所以暂时只想到了这一种方法。或许有更好的算法。但是学知浅薄····
 * **/
public class Program {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);   //new一个接收输入的对象
        System.out.print("请先输入一个整型数组,以空格隔开:");
        String[] strs = scanner.nextLine().split(" ");//这里=左边声明一个String数组,右边接收一行输入并以空格进行分割作为一个数组赋值给左边
        int[] ints = new int[strs.length];  //new一个同长度的int类型数组
        for (int i = 0; i < ints.length; i++) {   //循环利用intger类的valueOf方法将String转为int
            ints[i] = Integer.valueOf(strs[i]);
        }
        System.out.print("\n你输入的数组的局部最高点有:");
        Local_peak(ints);  //调用方法

    }
    /**
    *@Description: 返回参数列表数组(一维数组)中的所有局部最高点
    *@Param: 
    *@return: void
    *@Author: your name
    *@date: 2020/9/5 0005
    **/
    static void Local_peak(int[] ints)
    {
        /*我想做出来的效果是:从左到右依次输出它的局部最高点,所以按照题意,先判断第一个元素,
        然后判断中间的,最后判断最后一个元素,因为第一个和最后一个与中间的需要满足的要求不同*/

        if (ints[0] > ints[1])     //第一个元素大于相邻的也就是第二个就是,就输出它
            System.out.print(ints[0]+" ");

        for (int i = 1; i < ints.length-2; i++) {      //利用循环遍历判断中间的,循环排除第一个与最后一个
            if (ints[i] > ints[i+1])   //当这个数大于后相邻数
            {
                if (ints[i] > ints[i-1]) {    //嵌套,还大于前相邻数
                    System.out.print(ints[i]+" ");   //就是一个局部最高点,就输出它
                }
                i++;    /*这里的i++当在数组的长度很大,但是局部最高点不多的情况下,能大大减少循环的次数,提高效率,比如:2 5 3 x
                            很明显的,5在这里是一个局部最高点,它大于右边相邻数,右边的相邻数(3)就一定小于它的左相邻数(5),
                        它就一定不是一个局部最高点,并且不论x是多少,都不用管就可以跳过它的判断,减少一部分没必要的循环次数,提高效率*/
            }
        }

        if (ints[ints.length-1] > ints[ints.length-2])    //最后判断最后一个元素
            System.out.println(ints[ints.length-1]);
    }
}

下面这是运行结果:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值