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]);
}
}
下面这是运行结果: