Leetcode-每日一题【剑指 Offer 56 - I. 数组中数字出现的次数】

news2024/9/21 13:26:33

题目

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

示例 1:

输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]


示例 2:

输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]

限制:

2 <= nums.length <= 10000

解题思路

前置知识

异或

表示当两个数的二进制表示,进行异或运算时,当前位的二进制相同为0,不同为1.

表示为:

  • 0 ^ 0 = 0
  • 1 ^ 0 = 1
  • 0 ^ 1 = 1
  • 1 ^ 1 = 0

特点

  1. 0异或任何数,是任何数;
  2. 1异或任何数,任何数取反;
  3. 任何一个数字异或自己都等于0

了解了上述知识后,我们来看一下这道题

1.题目要求我们找出这两个只出现一次的数字。我们首先想到的可能是去暴力求解,但是题目要求时间复杂度是O(n),空间复杂度是O(1)。所以我们不得不换一种思想,这个时候我们就可以去考虑一下用位运算去解决了。

2.我们知道如果在求一个数组中只出现一次的数字时,我们可以直接使用异或来求出这个单独的数字

举个例子:

异或后:

 3.但是此时我们的一个数组中存在两个只出现一次的数字

再举个例子

异或后:

 

最终得到的结果就是两个只出现一次的数字的疑惑结果。因为其他数字都出现了两次,在异或中全部抵消了。

4.由于两个数字不一样,异或结果不为0,也就是说在这个结果数字的二进制中至少有一位是不同的。若两个数字的二进制位不同时,那么他们异或后的二进制位就为一,

 

如上图,因为5和6二进制位的第一位和第二位都不同,所以5 ^ 6 后的二进制位的第一位和第二位就为1,此时我们可以设置一个int 类型的 m = 1  让 m &(与)(5 ^ 6),目的是去找到5和6从右往左第一位不同的二进制位,

 

5.然后我们根据这位不同的二进制位把原数组中的数字分为两个子数组,第一个子数组中每个数字的第二位都是1,而第二个子数组中每个数字的第二位都是0。由于我们分组的标准是数字中的某一位是1还是0,那么出现了两次的数字一定会被分配到同一个子数组。这样每个子数组都包含一个只出现一次的数字,而其他数字都出现了两次。

6.最后我们对两个分好的数组进行异或,这时因为两个不同的数被分进两个数组中,所以两个数组异或后的结果就是这两个不同的数,我们new一个新数组,将这两个异或后的结果放入并返回即可。

代码实现

class Solution {
    public int[] singleNumbers(int[] nums) {
        int temp = 0;
        for(int i = 0; i < nums.length; i++){
            temp ^= nums[i];
    }
        int m = 1;
        while( (m & temp) == 0){
            m = m << 1;
        }
        int x = 0, y = 0;
        for(int i = 0; i < nums.length; i++){
            if((m & nums[i]) == 0){
                x ^= nums[i];
            }else{
                y ^= nums[i];
            }

        }
        return new int[]{x,y};
    }
}

测试结果

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/812088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IOS开发:去除TabView的底部留白

我最近在做IOS开发的时候&#xff0c;使用SwiftUI中的TabView做左右滚动的页面切换&#xff0c;遇到了页面底部有大量留白无法去除的问题&#xff1a; 我查了很多资料都没有看到网上有人记录这个问题的解决方案&#xff0c;后来查阅apple developer的文档&#xff0c;我发现.ed…

模电基础知识学习笔记

文章目录&#xff1a; 一&#xff1a;基本元器件介绍 1.二极管 1.1 普通二极管特性测试 1.2 稳压二极管测试 1.3 整流二极管 1.4 开关二极管 2.电容 3.三极管(电流控制) 3.1 介绍 3.2 类型&#xff08;PNP、NPN&#xff09; 3.3 三种工作状态:放大状态、截止状态…

RBAC权限详解

1.传统的权限设计 首先&#xff0c;我们先了解下什么是传统的权限设计 从上面的图中&#xff0c;我们发现&#xff0c;传统的权限设计是对每个人进行单独的权限设置&#xff0c;但这种方式已经不适合目前企业的高效管控权限的发展需求&#xff0c;因为每个人都要单独去设置权限…

大盗阿福(记忆化搜索板子)

提供核心代码&#xff1a;&#xff08;经典的记忆化搜索套路&#xff09; int dfs(int pos){if(f[pos]!-1) return f[pos];//记忆化if(pos>n) return 0;//边界&#xff0c;越界int sum0;//模板int f10,f20;f1dfs(pos1);f2dfs(pos2)w[pos];summax(f1,f2);//模板f[pos]sum;//模…

表达式树

请设计一个算法&#xff0c;将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。 例如&#xff0c;当下列两棵表达式树作为算法的输入时&#xff1a; 输出的等价中缀表达式分别为 (ab)*(c*(-d)) 和 (a*b)(-(c-d))。 注意&#xff1a; 树…

ChatGPT炒股:自动批量提取股票公告中的表格并合并数据

在很多个股票公告中&#xff0c;都有同样格式的“日常性关联交易”的表格&#xff0c;如何合并到一张Excel表格中呢&#xff1f; 首先&#xff0c;在ChatGPT中输入提示词&#xff1a; 写一段Python代码&#xff1a; F盘文件夹“新三板 2023年日常性关联交易20230704”中很多…

零代码编程:PDF文件名和Excel数据进行比对找不同

F盘“北交所招股说明书”文件夹下有150个文件&#xff1b; F盘”北证A股20230703.xlsx”表格中证券名称有200多个&#xff1b; 现在想找出文件夹下的哪些证券名称不在表格里面。 在ChatGPT中输入提示词&#xff1a; 写一段Python程序&#xff1a; F盘“北交所招股说明书”文…

qt源码--事件系统之QAbstractEventDispatcher

1、QAbstractEventDispatcher内容较少&#xff0c;其主要是定义了一些注册接口&#xff0c;如定时器事件、socket事件、注册本地事件、自定义事件等等。其源码如下&#xff1a; 其主要定义了大量的纯虚函数&#xff0c;具体的实现会根据不同的系统平台&#xff0c;实现对应的方…

AD21原理图的高级应用(五)自定义原理图模板及调用

&#xff08;五&#xff09;自定义原理图模板及调用 1.创建原理图模板2.调用原理图模板 1.创建原理图模板 利用 Altium Designer 软件在原理图中创建自己的模板,可以在图纸的右下角绘制一个表格用于显示图纸的一些参数,例如文件名、作者、修改时间、审核者、公司信息、图纸总数…

建造者设计模式 + 高阶函数 => DSL

该设计模式适用于创建复杂对象&#xff0c;该复杂对象通常是由各个部分的子对象用一定的算法或者步骤构成&#xff0c;针对每个子对象内部算法和步骤通常是稳定的&#xff0c;但是该复杂对象的确实由于不同的需求而选择使用不同的子对象进行组装。对于构建该复杂的对象&#xf…

Vue2 第六节 key的作用与原理

&#xff08;1&#xff09;虚拟DOM &#xff08;2&#xff09;v-for中的key的作用 一.虚拟DOM 1.虚拟DOM就是内存中的数据 2.原生的JS没有虚拟DOM: 如果新的数据和原来的数据有重复数据&#xff0c;不会在原来的基础上新加数据&#xff0c;而是重新生成一份 3. Vue会有虚拟…

结构方程模型的绘制

模型的绘制是我们最终呈现出的一个结果 所以说这个课程主要关注的有两点 第一点就是模型图的绘制 第二点就是结果的解释 关于中间计算过程和背后的理论的一个结果 在本文章的所有的讲解过程中 只注重模型图的绘制方法 如何高效的绘制出所需要的一个模型图 同时能够调整…

【小吉带你学Git】Git分支

&#x1f38a;专栏【Git】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f916;概述&#x1f354;什么是分支&#x1f354;使用分支的好处&am…

百万QPS系统如何设计?

一、关系链业务简介 从主站业务角度来看&#xff0c;关系链指的是用户A与用户B的关注关系。以关注属性细分&#xff0c;以关注&#xff08;订阅&#xff09;为主&#xff0c;还涉及拉黑、悄悄关注、互相关注、特别关注等多种属性或状态。目前主站关系链量级较大&#xff0c;且还…

九、HAL_IWDG独立看门狗的使用

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407ZGT6 2、IWDG简介 (1)IWDG即独立看门狗。 (2)看门狗本质上是一个定时器&#xff0c;设置一个时间&#xff0c;时间到即让程序复位。所以需要在在时间未到之前重置定时器&#xff0c;也就是喂…

线性表详细讲解

2.1 线性表的定义和特点2.2 案例引入2.3 线程表的类型定义2.4 线性表的顺序表示和实现2.4.1 线性表的顺序存储表示2.4.2 线性表的结构类型定义2.4.3 顺序表基本操作的实现2.4.4 顺序表总结 2.5 线性表的链式表示和实现2.5.1 线性表的链式存储表示2.5.2 单链表的实现&#xff08…

ARM裸机-3

1、嵌入式和单片机的区别 1.1、芯片平台 主流的单片机平台&#xff1a;51、PIC、STM32、AVR、MSP430等 主流的嵌入式平台&#xff1a;ARM、PPC、MIPS 1.2、资源、价格、应用领域 单片机片上资源有限、价格低、应用领域多为小家电、终端设备等。 嵌入式系统片上资源丰富、价格…

数据库连接及使用Statement对象完成CRUD

一、数据库连接&#xff1a; 二、使用Statement对象完成CRUD&#xff1a; 1、插入&#xff1a; 2、删除 3、修改 4、查询 三、ORM对象关系映射

数据结构:顺序表详解

数据结构&#xff1a;顺序表详解 一、 线性表二、 顺序表概念及结构1. 静态顺序表&#xff1a;使用定长数组存储元素。2. 动态顺序表&#xff1a;使用动态开辟的数组存储。三、接口实现1. 创建2. 初始化3. 扩容4. 打印5. 销毁6. 尾插7. 尾删8. 头插9. 头删10. 插入任意位置数据…

pytorch 中 view 和reshape的区别

在 PyTorch&#xff08;一个流行的深度学习框架&#xff09;中&#xff0c; reshape 和 view 都是用于改变张量&#xff08;tensor&#xff09;形状的方法&#xff0c;但它们在实现方式和使用上有一些区别。下面是它们之间的主要区别&#xff1a; 实现方式&#xff1a; reshap…