数组中出现一次的数字

找出数组中只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入: [4,1,2,1,2] 输出: 4 如果没有时间复杂度和空间复杂度的限制,可以使用集合存储数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。 Java代码如 阅读详情
题目:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

分析:
我们可以先考虑一个稍微简单点的情况,一个整型数组里除了一个数字之外,其他的数字都出现了两次。这是上面题目的一个简化版本。我们只要能解决这个问题了,然后将上面题目中的数组按照某种规则分别分成两个只有一个数字出现一次的数组,就可以解决上面的题目。
所以,现在我们面临的是两个问题:

1.如何在一个整型数组中找到仅出现一次的那个数。
2.如何将题目中的整形数组分成两个只有一个数字出现一次的数组。

对于第一个问题,我们可以使用异或来解决,异或的性质是一个数异或自己本身就会消失,所以我们只有连续异或这个数组中的每个数字,最后异或出来的结果就是数组中仅出现一次的那个数。
第二个问题,如果我们将有两个仅出现一次的数字的数组中的每个元素都异或一次,那么异或的结果就是数组中仅出现一次的那两个数的异或结果,而这个结果肯定不为0,我们可以在这个结果数字中选取某一位,将题目中的数组分成这一位为0的和这一位不为0的两部分,分别对每一部分求解即可。

class Solution
{
public:
    void FindNumsAppearOnce( vector<int> data, int* num1, int* num2 )
    {
        if ( data.empty() )
            return ;

        int resultExclusiveOR = 0;
        for ( int i = 0; i < data.size(); ++i )
            resultExclusiveOR ^= data[i];

        unsigned int indexOf1 = FindFirstBitIs1( resultExclusiveOR );

        *num1 = *num2 = 0;
        for ( int j = 0; j < data.size(); j++ )
        {
            if ( IsBit1( data[j], indexOf1 ) )
                *num1 ^= data[j];
            else 
                *num2 ^= data[j];
        }
    }

    unsigned int FindFirstBitIs1( int num )
    {
        int indexBit = 0;
        while ( (( num & 1 ) == 0) && ( indexBit < 8*sizeof(int) ) )
        {
            num = num >> 1;
            ++indexBit;
        }
        return indexBit;
    }

    bool IsBit1( int num, unsigned int indexBit )
    {
        num = num >> indexBit;
        return ( num & 1 );
    }
};

int main( void )
{
    Solution sos;
    vector<int> array = { 2, 4, 3, 6, 3, 2, 5, 5 };
    int num1 = 0, num2 = 0;
    sos.FindNumsAppearOnce( array, &num1, &num2 );
    cout << num1 << num2 << endl;

    return 0;
}
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。 #include<stdio.h> #include<string.h> #include<Windows.h> #include <assert.h> void search(int a[], int num) { assert(a); assert(num > 0); int *x = (int *)malloc(sizeof(int *)); 阅读详情

相关推荐

ESD放电路径分析

当金属外壳接地情况下,大部分外部干扰信号将会通过外壳,外壳到接地点,再由接地点回到干扰信号的地,实现干扰信号的回流,这点不仅仅适用于​ESD,对于其他的RI类干扰,也同样适合。发现内部金属板跟外壳的搭接处存在较多的缝隙点,该缝隙点对于频率较高的信号能够实现较为理想的回流,但是对于频率没有那么高的信号,则较难以实现回流,我们尝试将这些缝隙用铜箔包裹住,充分降低该金属板跟外壳的接触阻抗​。我们分析,路径3其实是不期望的路径,我们最期望的路径是1,或者2的内部金属部件跟外壳良好接触情况下的路径。

domen_pan的博客 2232

数组中只出现一次的数字

题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 链接:https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811 来源:牛客网 首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。 当只有一个数出现一

wl_ss的博客 505

睿尔曼复合机器人之底盘操作流程

控制键”按下后,可在键盘上通过‘i’(向前),‘k’(向后),‘j’(向左旋转),‘l’(向右旋转)四个按键对底盘进行运动控制。选中禁⾏线功能后,使⽤⿏标在界⾯内点击选择起点,继续在其他地⽅点击,两点之间会连成⼀条线,可以进⾏多次连续点击,形成连续线条。4)扫图完成后,软件会重新启动,返回到监控页面,点击“激光”可看到当前机器激光扫描的实时数据,在页面上表现为红色边界线,点击菜单栏“控制”键使底盘在一定范围内运动,扫描到尽可能多的边界线,可发现与实际地图的黑色边界线不同,需要进行手动校正。

realman_Rop的博客 1475

40_FindNumsAppearOnce

题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 思路: 思路1:O(n) 首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。 1)当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数, 因为成对儿出现的都抵消了。 2)依照这个思路...

weixin_44683593的博客 310

QtWebApp的使用【在Qt中搭建HTTP服务器】(一)

用Qt和QtWebApp能够实现在C++中开发HTTP Web服务器应用程序。 首先,需要先安装Qt的软件开发工具包。点此下载 其次,下载最新的QtWebApp库。点此下载 下载并解压缩QtWebApp ZIP文件。你将会看到: 如何使用QtWebApp 1)将QtWebApp.zip文件解压到文件夹中,并创建一个名为“ MyFirstWebApp”的新Qt控制台项目。然后,建立如下文件结构: 2)将以下行添加到MyFirstWebApp项目的项目文件中: QT += network include(

饭的笔记本 2万+

Jenkins插件下载慢?3分钟搞定国内镜像加速(含华为/腾讯/清华源对比)

本文详细介绍了如何通过国内镜像源加速Jenkins插件下载,包括华为云、腾讯云和清华源等主流镜像站的性能对比及一键配置方案。通过实测数据展示华为云镜像站表现最佳,下载速度达19.4MB/s,并提供sed命令、管理界面配置和Docker定制三种高效加速方案,帮助开发者快速解决插件下载慢的问题。

sql99的博客 320

剑指offer算法题:数组中只出现一次的数字FindNumsAppearOnce

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 import java.util.HashMap; //num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 public class Solution { public void FindNumsAppearOnce(int [] array,in...

Mike的博客 381

从IR Drop到EM分析:数字IC电源规划中那些没人明说的细节(以MTCMOS配置为例)

本文深入探讨数字IC后端设计中电源规划的关键细节,特别关注MTCMOS配置、电源网络电阻最小化和level shifter供电等实战技巧。通过分析IR Drop和EM问题,提供优化floorplan和powerplan的具体策略,帮助工程师避免常见陷阱,提升芯片设计的稳定性和可靠性。

q9w8e7r6t5的博客 511

每日一练之数组中只出现一次的数字

数组中只出现一次的数字 OJ地址:数组中只出现一次的数字 方法一:哈希表法 很显然的方法,遍历一遍数组,用map记录出现的次数,然后再遍历一遍数组,找出出现1次的数字 void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { if(data.size() == 0) return; unordered_map<int, int> map; fo

qq_41033011的博客 222

LTR-390UV-01对比VEML6075:5个真实项目中的选型避坑指南

本文对比了LTR-390UV-01和VEML6075两款环境光传感器在5个真实项目中的表现,提供了选型避坑指南。通过智能手环、农业温室、紫外线消毒柜等场景的实测数据,分析了动态范围、抗干扰性、温度稳定性等关键差异,帮助开发者在成本与性能间做出最优选择。

weixin_28733777的博客 220

六自由度机器人(机械臂)运动学建模及运动规划系列(一)——简介

毕业设计做了六轴机器人相关的课题,做完之后学到很多,在这里分享一下。

weixin_47849087的博客 2万+

算法 数组 只出现一次的数字

其中一个经典的问题是“只出现一次的数字”,即给定一个数组,其中除了一个数字之外,其他数字都出现了两次,找出那个只出现一次的数字。遍历数组时,所有成对出现的数字会被抵消掉,最终结果就是只出现一次的数字。排序法通过先对数组进行排序,然后遍历排序后的数组,检查相邻的元素是否相等,找出只出现一次的元素。哈希表法通过使用哈希表(字典)来记录每个元素的出现次数,遍历数组时更新哈希表,最后找出只出现一次的元素。暴力法是最直观的方法,通过双重循环遍历数组,统计每个元素的出现次数,找出只出现一次的元素。学习路线(点击解锁)

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1300

华为OD机试2025C卷-双十一最大花费金额[100分](Java_Python3_C++_C语言_JsNode_Go)实现100%通过率

双十一最大花费金额 - 动态规划解法 摘要:本文介绍了华为OD机试中"双十一最大花费金额"问题的动态规划解法。该问题要求在给定N件商品价格和优惠券面额X的情况下,选择若干商品使总花费不超过X且尽可能大。核心解法采用布尔型动态规划数组,记录每个金额是否可被拼出。算法时间复杂度为O(N*X),空间复杂度为O(X)。通过倒序遍历避免重复选择同一商品,最后从X向下查找第一个可达金额作为答案。文中提供了C++和Java的实现代码,并解释了与经典0-1背包问题的关系。 关键点: 问题本质是0-1背包/子集和问题的变体

2503_91057718的博客 47

Java——数组中只出现一次的数字

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

m0_60867520的博客 970

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[剑指Offer]-数组中唯一只出现一次的数字

题目描述 在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。 这题有点意思,其他数字都重复了三次,一般位运算就消不掉了。 解题思路 将所有数字的二进制表示的对应位都加起来,如果某一位能被三整除,那么只出现一次的数字在该位为0;反之,为1。 算法图解 参考代码: package offer; /** * 数组中唯一个出现一次的数字, * 除此之...

LeoByte的编程驿站 2374

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

一个数组中有三个数字a、b、c只出现一次,其他数字都出现了两次。请找出三个只出现一次的数字。

本文参考:http://zhedahht.blog.163.com/blog/static/25411174201283084246412/ http://blog.youkuaiyun.com/wypblog/article/details/8032898 题目:一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个。比如数组元素为【1, 2,4,5,6,4,2】,只有1,5

龙乐的专栏 2431

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

leetcode-数组中只出现一次的数字

leetcode-数组中只出现一次的数字 一、版本1—有序数组中只出现一次的数字 1、题目描述   给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。   示例 1: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2   示例 2: 输入: [3,3,7,7,10,11,11...

qq_40148886的博客 460

求解数组中只出现一次的数字 python

题目一:在一个数组中,只有1个数字仅出现1次,其余数字出现2次,求只出现一次的那个数字。 关键点:异或运算 相同的数字异或的结果是0:2^2=0 和0异或是本身:0^2=2 代码: def one_number(alist): '''一个数组中只有1个数字出现1次,其余都出现偶数次''' a=0 for i in alist: a^=i r...

xiaolangmin的博客 2202

数组中只出现一次的数字——js

数组中只出现一次的数字 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 思路 第一种:indexOf()和lastIndexOf(),只要两个相等,就是只出现一次的数。 第二种:使用map记录下每个数的次数,占空间。 第三种:根据异或结果中1所在的二进制位数,把数组中数分成两种不同类别,分别异或得出结果。 位运算中异或的性质:两个相同数字异或=0,一个...

qq_40608516的博客 2541
上一篇: 二叉树的深度
下一篇: 和为s的两个数字VS和为s的连续正数序列
Findway_
博客等级 码龄10年 36粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值