寻找缺失的整数

11.寻找缺失的整数

题目

在一个无序数组里有99个不重复的正整数,范围是1100,唯独缺少一个1100的整数。然后找出这个缺失的整数。

思路

1.对无序数组,进行升序排序,先判断首位是否为2或99,如果是则得到缺失值,否则,不连续的两个元素中间即为,缺失值。时间复杂度,为排序算法的时间复杂度,空间复杂度为O(1)。代码略

2.求出无序数组的和,用1+2+...100 -和,即为缺失值。时间复杂度O(n),空间复杂度O(1)。代码略

题目扩展1

题目

在一个无序数组里有若干个正整数,范围是1~100,其中99个整数都出现了偶数次,只有一个整数出现了奇数次,如何找到这个出现奇数次的整数?

这里,用到离散数学中的异或运算规律。

```txt
n为整数
n xor n = 0;
n xor 0 = n;
```
思路

一个整数,与本身异或的结果一定是0,而偶数次的整数,在异或操作中都为0了,而奇数次的整数,与0异或的结果一定是其本身。

代码
```java
public static int getLostNum(int[] array){
       if(array.length == 1)
           return array[0];
       int first = array[0];
       for(int i = 1; i < array.length;i++){
           first ^= array[i];//Java中^(两边是数字类型)用来表示数学异或运算
       }
       return first;
   }

    public static void main(String[] args) {
        int[] arr = {1,1,5,5,7};
        System.out.println(getLostNum(arr));
    }
```

时间复杂度O(n),空间复杂度O(1)。

题目扩展2

题目

假设一个无序数组里有若干个正整数,范围是1~100,其中有98个整数出现了偶数次,只有2个整数出现了奇数次,如何找到2个出现奇数次的整数?

思路

按照扩展1的逻辑,则题目2中无序数组,依次异或的结果,一定是,出现奇数次的结果result = A xor B。并且这个,结果一定是不等于0的,因为如果等于0了,就代表这两个数相同了,不符合题意。如何根据这个!=0的异或结果,求出这两个值呢?result不等于0,代表结果的补码中,一定至少有一位的值为1,代表,在这一位,A和B的补码,一定一个是1一个是0,就可以利用这个特性,将原数组,分为两个子数组,且A和B一定会分到两个数组中,再利用扩展1的思路,分别独立进行异或运算,两个子数组的结果,就是A和B。

代码
```java
public static int[] getLostTwoNum(int[] array) {
        int[] result = new int[2];
        int xorResult = 0;
        for (int i = 0; i < array.length; i++)
            xorResult ^= array[i];
        if (xorResult == 0)
            return null;//不符合题意
        int separator = 1;
        //确定2个整数的不同位,以此分组
        while (0 == (xorResult & separator))
            separator <<= 1;//算术左移
        //经过while循环后,separator的值,为xorResult中从右往左第一个不为0的位所代表的值
        for(int i = 0; i < array.length; i++){
            //分为两组
            if(0 == (array[i] & separator))//代表对应位为0
                result[0] ^= array[i];
            else//代表对应位为1
                result[1] ^= array[i];
        }
        return result;
    }
```

时间复杂度O(n),空间复杂度O(1)。

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/6442.html

(0)
LomuLomu
上一篇 2025 年 1 月 15 日 上午4:22
下一篇 2025 年 1 月 15 日 上午4:52

相关推荐

  • 深入解析MySQL半同步复制关键参数配置原理

    在分布式数据库架构中,我们近期遇到一个典型案例:某业务系统采用跨机房MySQL主从部署并启用半同步复制后,主库写入延迟显著增加至40毫秒。由于该业务对数据写入时效性要求极高,最终通过关闭从库半同步参数(rpl_semi_sync_slave_enabled),切换为异步复制模式,成功将写入延迟优化至2毫秒。这个案例充分说明,在跨机房部署且对性能敏感的场景下,…

    2025 年 5 月 12 日
    22300
  • JSON字符串反序列化 动态泛型

    需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。 方案一:将方法参数存成JSON字符串,然后JSON反序列化成对象,然后反射调用 目标方法时这样的: “` CommandResp sendXXX(BaseCommandApiDTO baseCommandApiDTO); “` 方式一:FastJson “` Class mainBod…

    未分类 2024 年 12 月 31 日
    38000
  • ChatGPT-Plus共享账号,全网最高性价比!

    系统界面展示,原汁原味的官方ChatGPT-Plus! 这可能不是我用过最便宜的ChatGPT共享账号,但绝对是性价比最高,用起来最稳定的平台,没有之一! 我们有专业的技术团队,已经稳定运营一年之久。我们的维护成本很大,基本大家下单的钱都用于账号购买和技术升级,基本没有多少的利润,只为给大家提供一个安全/稳定的GPT服务。如果网站体验好,请帮我们宣传,足够的…

    2024 年 7 月 10 日
    2.4K00
  • 深入理解 Java 接口的回调机制

    前言 回调是一种非常重要的编程技术,它广泛应用于事件驱动的编程、异步任务和框架设计中。在 Java 中,回调机制通常通过 接口 来实现。本篇博客将详细解析 Java 接口的回调原理、实现方式,以及实际开发中的应用场景。 泪崩了,期末JAVA编程考了回调,小编不会。 一、什么是回调? 回调(Callback) 是指通过将一个方法作为参数传递给另一个方法,在某些…

    2025 年 1 月 15 日
    44600
  • 【Java】还在死磕算法?懂“堆”与“优先级队列”,代码效率飙升

    个人主页:喜欢做梦 欢迎 💛点赞 🌟收藏 💫关注 🏆堆 一、🎯什么是堆 堆的概念 堆是一种特殊的完全二叉树 ,如果有一个关键码的集合K={k0,k1,k2,…,kn-1} ,把它所有的元素按照完全二叉树的顺序存储方式 在一维数组 中,并满足:Ki

    2025 年 1 月 6 日
    37700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信