数组中只出现一次的数字

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

分析:看到这题,首先要明白,这是求两个数字。还要明白其要求,空间复杂度和时间复杂度。如果没有这些约束我们可以有很多方法解,如Hash、逐次遍历等。

        当常规方法无法满足要求,我们就可以使用一个神奇的工具:位运算。

        我们首先看看当只是一个数字是只出现一次怎么求解。

        异或运算有一个性质:任何一个数字异或自己都等于0。多个数字依次做异或运算,相同的数字会抵消。看下例:

        例如一个输入数组:{1,2,3,2,3}

        0001

        0010  异或得到:

        0011

        0011 异或得到:

        0000

        0010 异或得到:

        0010

        0011 异或得到:

        0001

        看到木有,数组里面相同的数字都抵消了。这里只是针对只有一个数字是只出现一次的。其他情况不成立。

        

       但是本题里有两个,直接这么做事不成立的,怎么办? 我们想到,用位整个数组运算以后得到的结果有什么作用呢?很明显,出现两次的数在位运算后抵消了,那么其实就是两个只出现一次的两个数做的位运算。例如:

      {1,2,2,3}

      0001

      0010 异或得到:

      0011

      0010 异或得到:

      0001

      0011 异或得到:

      0010      这个结果和  1^3=0010是一样了,验证了上面的理论。

      好了,有了这个有用的信息,那么我们就可以用这个结果中位为1来区分成两组数据,很显然这两组数据中都分别只包含一个只出现一次的数字(作的异或运算嘛,=1,说明它们是不同的。)。然后再用最开始讲到的方法去做就OK拉。代码贴上来:

    

bool Judge(int pData, int BitIndex)
{pData = pData >> BitIndex;return (pData & 1);
}
void FindOnlyOneNumbers(int pData[],int length, int &num1,int &num2)
{//1.异常检测if (pData == NULL || length < 2)return;//2.求出区分位int resultExclusive = 0;for (int i = 0; i < length; i++)resultExclusive ^= pData[i];      //假如只有一个数字是只出现一次,那么这个结果就是这个数字,如果两个的话,那么这个数字中位为1即是只出现一次的两个数的不同位。//3.接下来为了区分两者,我们寻找区分位最右边为1的位int indexCount = 0;while (resultExclusive&1==0&&indexCount<=8*sizeof(int)){resultExclusive >> 1;indexCount++;}//4.然后按照区分位的不同,将pData分成两组,这里没必要用两个数组保存,直接进行用位运算分别计算两个数就ok了int resultExclusive1 = 0, resultExclusive2 = 0;for (int i = 0; i < length; i++){if (Judge(pData[i],indexCount))resultExclusive1 ^= pData[i];elseresultExclusive2 ^= pData[i];}num1 = resultExclusive1;num2 = resultExclusive2;
}

 

        

转载于:https://www.cnblogs.com/menghuizuotian/p/3828909.html

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

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

相关文章

iOS工作笔记之NSClassFromString

id myObj [[NSClassFromString("MySpecialClass") alloc] init]; 和 id myObj [[MySpecialClass alloc] init]; 是一样的。但是&#xff0c;如果你的程序中并不存在MySpecialClass这个类&#xff0c;下面的写法会出错&#xff0c;而上面的写法只是返回一个空对象而…

Maven 使用bat批量清除本地仓库的lastUpdated文件

echo off set REPOSITORY_PATHC:\Users\Administrator\.m2\repository rem 正在搜索... for /f "delims" %%i in (dir /b /s "%REPOSITORY_PATH%\*lastUpdated*") do ( del /s /q %%i ) rem 搜索完毕 pause 新建一个文件txt文件&#xff0c;把.txt后缀…

“ddl”有一个无效 SelectedValue,因为它不在项目列表中。

“ddl_ekt”有一个无效 SelectedValue,因为它不在项目列表中。 怎么回事 现象&#xff1a; 在用户控件的page_load事件里绑定下拉框&#xff0c;报上面错误 解决&#xff1a; 将下拉框绑定&#xff0c;放在page_Init事件里 这可能跟服务器加载控件的生命过程有关系转载于:https…

springbot 注入多实例

方式一&#xff1a; 在需要多实例的类上加入注解&#xff1a; Scope("prototype") 方式二&#xff1a; 在启动类上加入&#xff1a; BeanScope(value ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode ScopedProxyMode.TARGET_CLASS)public PrototypeClass…

javascript日历插件

javascript日历插件 原文:javascript日历插件javascript日历插件 最近在尝试着写javascript日历插件&#xff0c;所以也到github上看国外人日历源码&#xff0c;或者国内人写的好点的&#xff0c;也在研究点&#xff0c;虽然看到网上有一大把的日历控件&#xff0c;但是没有几个…

idea 重启

1、通过File–>Invalidate Caches/Restar...进入重启窗口 2、选择自己所需要的重启方式&#xff0c;四个按钮&#xff0c;一共三种重启方式&#xff1a; Invalidate and Restart 清空缓存并重启。Invalidate 清除缓存&#xff0c;下次打开重启。Cancel 取消。Just Restart …

Kernel Page Global Directory (PGD) of Page table of Process created in Linux Kernel

Kernel Page Global Directory (PGD) of User process created 在早期版本: 在fork一个进程的时候&#xff0c;必须建立进程自己的内核页目录项&#xff08;内核页目录项要与用户空间的页目录放在同一个物理地址连续的页面上&#xff0c;所以不能共享&#xff0c;但所有进程的内…

POI 导出文件以文件流形式返回

POI工具类 import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import o…

Json串和java对象进行转时

json-lib-xxx.jarezmorph-xxx.jar //>依赖包 JsonConfig config new JsonConfig();//有选择性的过滤掉一些属性值 JSONUtils.getMorpherRegistry().registerMorpher( new DateMorpher(new String[] { "yyyy-MM-dd" }));//注册一个json转为java.util.date的日期格…

Mybatis Integer类型参数值为0时判断为空、空字符串不通过

根据状态查询是&#xff0c;由于status是Integer类型&#xff0c;所以当前状态为0时&#xff0c;变成了查询了所有的状态信息。 <if test"requestParam.status ! null and requestParam.status ! ">and s.status #{requestParam.status} </if> 原因&a…

BZOJ 3391: [Usaco2004 Dec]Tree Cutting网络破坏(搜索)

这道直接遍历一遍求出每个点的子节点数目就行了 CODE&#xff1a;#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;#define maxn 50010int b[maxn],q[maxn],id[maxn],ans[maxn];bool cmp(int x,int y){re…

Fast Matrix Operations

uva11992:http://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem3143 题意&#xff1a;给你n*m的矩阵初始化的时候矩阵里面的元素全部是0&#xff0c;对于这个矩阵有3中操作。 1 x1 y1 x2 y2 v 把&#xff08;x1 y1 x2…

linux ll命令无效

1.编辑~/.bashc vim ~/.bashc 若vi/vim命令无效&#xff0c;参考 bash: vi: command not found/bash: vim: command not found 2.重新执行刚修改的初始化文件 source ~/.bashc

jquery不同版本冲突导致低版本功能不能用

oConflict() 方法让渡变量 $ 的 jQuery 控制权。 该方法释放 jQuery 对 $ 变量的控制。 使用方法&#xff1a; var jq $.noConflict();//转换控制权 jq(document).ready(function () { jq("#outside").click(function () {你的操作...... }); }); });转载于:https:/…

struts2+jquery 实现ajax登陆

一、新建一个web项目&#xff1a;test,配置好struts2的环境(详细配置见&#xff1a;http://www.cnblogs.com/wuweidu/p/3841297.html) 导入Jquery的js文件到项目 二、在com.action包下&#xff0c;新建一个loginAction.java loginAction.java的代码如下 package com.action;imp…

hdu 2026 首字母变大写

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid2026 题目大意&#xff1a;将一个英文句子&#xff0c;每个单词第一个首字母变大写。 1 #include <stdio.h>2 int main (void)3 {4 int i;5 char ch[100];6 while(gets(ch))7 {8 for (i0; c…

Docker Kafka 单机版安装

一、安装 下载library/zookeeper并运行 docker run --name zookeeper -d -p 2181:2181 -v /etc/localtime:/etc/localtime library/zookeeper 测试zookeeper端口是否通wget IP:2181 下载wurstmeister/kafka并运行 docker run -d --name kafka -p 9092:9092 --link zookeeper…

HDU1429胜利大逃亡(续)HDU 1885 Key Task BFS+状态压缩+水

HDU1429 只有10把钥匙 1<<10足够了 标记用三维数组 用Linux好不习惯 继续克服&#xff5e; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <ctype.h> #include &l…

Docker 安装nginx,并挂载文件

创建挂载所需目录&#xff1a; mkdir /test/server/nginx/{conf,logs,html,conf.d} /test/server/nginx/conf创建nginx.conf文件&#xff0c;并编辑: user nginx; worker_processes 1;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {wor…

http解码-5

http://www.freebuf.com/articles/web/18084.html (1) 在 前端安全技术中常见的编码绕过技术利用的就是不同系统间的编码位宽(addslashes()楼哦的那个)&#xff0c;不同编码的解码顺序(htmlParserjavascriptParser的解码顺序)&#xff0c;不同的解码规则(unicode->ascii转换…