您当前的位置: 首页 >  Java

Kevin-Dev

暂无认证

  • 0浏览

    0关注

    544博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Java -- 算法】数组算法(三)

Kevin-Dev 发布时间:2020-07-15 23:22:56 ,浏览量:0

一、前言

本文介绍了有关数组的算法第三部分的 Java 代码实现,算法实例:

  • 在递增排序的数组中,查找指定数字出现的个数
  • 查找数组中只出现一次的两个数字
  • 在递增排序的数组中,查找和为s的两个数
  • 输入一个正数s,打印出所有和为s的连续正数序列
  • 数组当中的最大最小值
二、代码 1. 在递增排序的数组中,查找指定数字出现的个数

问题描述 在递增排序的数组中,查找指定数字出现的个数

解决思路 这个问题的关键信息是输入数组是 递增排序 的,指定数字必然是连在一起的,因此,我们只需要找到该数字第一次和最后一次出现的下标位置,那么就可以得到该数字出现的数字。

对于递增排序的数组,最常见的方法就是使用 二分查找,以查找数字第一次出现的位置为例,也就是下面的getFirstK函数:

  • 如果只有一个元素,那么判断该元素是否是指定数字即可
  • 如果只有两个元素,那么先判断前面的元素,如果不相等再判断后面的元素
  • 如果大于两个元素,那么取中点位置的元素,如果该元素比需要查找的数字小,那么就说明需要查找的元素在其右侧,否则就说明它在查找元素的左侧(有可能包含该中点位置元素)。

实现代码

class Untitled {

    static int getFirstK(int p[], int num, int startIndex, int endIndex) {
        if (endIndex == startIndex) {
            return p[startIndex] == num ? startIndex : -1;
        }
        if (endIndex-startIndex == 1) {
            if (p[startIndex] == num) {
                return startIndex;
            } else if (p[endIndex] == num) {
                return endIndex;
            } else {
                return -1;
            }
        }
        int midOffset = (endIndex-startIndex) >> 1;
        //如果中间的元素比寻找的小,那么说明其在中间元素的右侧。
        if (p[startIndex+midOffset] > 1;
        if (p[startIndex+midOffset] = 0 && lastK >= 0) {
            System.out.println("firstK=" + firstK + ",lastK=" + lastK);
        }
        return lastK-firstK+1;
    }

    public static void main(String[] args) {
        int p[] = {1, 2, 3, 6, 6, 6, 9};
        int result = getNumberAppearTimes(p, 6, 7);
        System.out.println("appear=" + result);
    }
}

运行结果

firstK=3,lastK=5 appear=3

2. 查找数组中只出现一次的两个数字

问题描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字。

解决思路 首先,让我们再复习一下异或的特点:两个相同的数异或的结果为0,且异或满足交换律和结合律。

对于题目中的假设,假如这两个只出现了一次的数为a和b:

  • 第一步:对整型数组中的所有数进行异或,那么得到的结果就是a^b的值。
  • 第二步:将a和b分到两个不同的子数组当中,再分别对这两个数组进行异或,那么就可以得到a和b了,而划分的依据就是根据第一步的结果,找出a^b中为1的一位。

实现代码

class Untitled {
    
    static void getTwoAppearOnce(int p[], int len) {
        int excluX = 0;
        int excluY = 0;
        for (int i=0; i= r.maxNum) {
            value.maxNum = l.maxNum;
        } else {
            value.maxNum = r.maxNum;
        }
        if (l.minNum             
关注
打赏
1658837700
查看更多评论
0.0688s