寻找缺失的整数

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

相关推荐

  • 【JavaSE】【网络协议】HTTP 请求和响应

    一、HTTP请求 1.1 请求格式 请求格式:首行+请求头(header)+空行+正文(body) 1.2 首行组成 首行组成:请求方法+URL+版本号。使用“空格”将他们分隔开。 1.2.1 请求方法 方法 说明 支持的HTTP版本 GET 获取资源 1.0 1.1 POST 传输实体主体 1.0 1.1 PUT 传输文件 1.0 1.1 DELETE 删…

    2025 年 1 月 14 日
    53900
  • 华为OD机试E卷 –分苹果 –24年OD统一考试(Java & JS & Python & C & C++)

    文章目录 题目描述 输入描述 输出描述 用例 题目解析 JS算法源码 Java算法源码 python算法源码 c算法源码 c++算法源码 题目描述 A、B 两个人把苹果分为两堆,A 希望按照他的计算规则等分苹果,他的计算规则是按照二进制加法计算,并且不计算进位 12+5=9 (1100 + 0101 = 9),B 的计算规则是十进制加法,包括正常进位,B 希…

    未分类 2025 年 1 月 19 日
    66600
  • JSP开发实战手册:基于IntelliJ IDEA构建首个动态网页项目

    JSP开发实战手册:基于IntelliJ IDEA构建首个动态网页项目 开篇导读 第一部分:JSP核心概念解析 1.1 JSP的核心功能 1.2 JSP与Servlet的技术关联 第二部分:使用IDEA开发JSP应用 第三部分:JSP与HTML技术对比 3.1 语法结构差异 3.2 注释方式对比 开篇导读 在掌握Web开发基础技术后(包括构建页面结构的HTM…

    2025 年 5 月 13 日
    44000
  • Java刷题训练第一期

    个人主页:手握风云 专栏:Java刷题训练营 1. 字符转ASCII码 问题描述:BoBo教KiKi字符常量或字符变量表示的字符在内存中以ASCII码形式存储。BoBo出了一个问题给KiKi,输入一个字符,输出该字符相应的ASCII码。 输入描述:一行,一个字符。 输出描述:一行,输出输入字符对应的ASCII码。 算法分析:在Java当中,没有针对字符的输入…

    2024 年 12 月 31 日
    55200
  • 探秘荣昌卤鹅美食地图:基于Java与天地图的地理信息实践

    目录导航背景介绍1、网红效应带动地方美食热潮2、荣昌卤鹅产业布局解析3、技术赋能美食探索一、地理信息检索基础1、检索功能概述2、API接口详解二、实战荣昌卤鹅定位1、数据采集方案2、API请求实现3、参数配置技巧4、数据存储方案三、实践总结 背景介绍 1、网红效应带动地方美食热潮 近期,重庆荣昌卤鹅因一起跨文化交流事件意外走红。当地助农主播林某通过创意营销,…

    2025 年 5 月 13 日
    43400

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信