寻找缺失的整数

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

相关推荐

  • 『玩转Streamlit』–查看K线的小工具

    在金融市场分析中,查看不同交易对的 K 线数据是一项基础且重要的工作。 今天,我们就来学习如何使用 Streamlit 构建一个简单的 K 线查看小工具,让你能够方便地查看不同交易对在不同时间范围内的 K 线数据。 1. 环境准备 首先,确保已经安装了必要的库。 除了 Streamlit 用于构建界面,还需要pandas 用于数据处理,plotly 用于绘制…

    2025 年 1 月 14 日
    50600
  • Java-学生管理系统[初阶]

    让我们来探索如何使用Java语言构建一个基础的“学生信息管理系统”。这个系统将允许我们管理学生的基本信息,包括添加、删除、修改和查询学生数据。接下来,我们将分步骤实现这个系统,并在后续的文章中探讨如何为其添加模拟登录功能。 基础版学生管理系统 在深入代码之前,我们需要掌握以下Java编程基础: Java的输入输出操作 Java的分支与循环结构 Java数组的…

    未分类 2024 年 12 月 27 日
    40400
  • Java中的线程安全的集合类(如果想知道Java中有关线程安全的集合类的知识,那么只看这一篇就足够了!)

    前言:在多线程编程领域,确保集合类的线程安全性对于维护数据的一致性和防止并发问题至关重要。Java 提供了一系列线程安全的集合类,它们各自在不同的并发场景下展现出独特的优势和局限。 在深入探讨之前,让我们先概览本文将要覆盖的主要内容: 目录 1.线程安全的集合类概览 2.多线程环境下ArrayList的使用策略 (1)直接操作ArrayList (2)利用C…

    2024 年 12 月 28 日
    43100
  • 一文搞懂架构设计的衡量标准:功能性、可用性、性能、可扩展性、安全性、协作效率、复杂度、成本效益

    大家好,我是汤师爷~ 架构设计的首要目标是服务于业务需求。因此,我们不应该盲目追求所谓的”最厉害的”架构,而应该致力于寻找最适合当前业务环境和未来发展需求的架构方案。 衡量架构的合理性是一个复杂的过程,需要从多个角度进行全面评估。主要可以从以下视角进行分析: 功能需求视角:评估架构是否有效支撑当前业务需求,并具有充分的灵活性以适应未来业务发展。 非功能需求视…

    未分类 2025 年 1 月 15 日
    52200
  • 【JavaScript】深拷贝详解

    文章目录 一、什么是深拷贝? 1. 浅拷贝与深拷贝的区别 示例: 2. 深拷贝的必要性 二、深拷贝的常见方法 1. JSON 方法 使用示例: 优点: 局限性: 2. 递归实现深拷贝 实现示例: 优点: 局限性: 3. 使用 Lodash 的 cloneDeep 方法 使用示例: 优点: 局限性: 4. 使用结构化克隆算法 使用示例: 优点: 局限性: 三、…

    未分类 2025 年 5 月 12 日
    25600

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信