首页 > 编程语言 >一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数...

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

时间:2023-06-06 13:34:51浏览次数:57  
标签:... 两个 int 位置 pos value 数组 return


一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数,要求算法的时间复杂度为O(n).

 

n为数组的长度。

 

 

程序代码如下:

 

//取二进制中首个为1的位置
int findFirstOne(int value)
{     
int pos = 0;
while ((value&1) != 1)
{
value = value>>1;
pos++;
}
return pos;
}

//测试某位置是否为1
char testBit(int value, int pos)
{  
return ((value>>pos)&1);
}

int findNums(int date[], int length, int *num1, int *num2)
{
if (length < 2)
{
return -1;
}

int ansXor=0;
int i = 0;
int pos = 0;

for (i=0; i<length; i++)
{
ansXor ^= date[i];               //异或
}

pos = findFirstOne(ansXor);

*num1 = *num2 = 0;

for(i=0; i<length; i++)
{	
if (testBit(date[i], pos))
{    
*num1 ^= date[i];
}
else
{
*num2 ^= date[i];
}
}

return 0;
}

 

1、首 先 第一次遍历整个数组,找出不同的那两个数的异或后的结果,见下面 这段代码 .

 

for (i=0; i<length; i++)
{
ansXor ^= date[i];               //异或
}

 

2、找到异或结果中ansXor中用移位的方式找到第一个二进制数中为1的位置,这个很关键,找到这个位置后,说明在该位置上,这两个不同的数中,一个为0,一个为1,这个应该可以理解对吧?

 

//取二进制中首个为1的位置
int findFirstOne(int value)
{     
int pos = 0;
while ((value&1) != 1)
{
value = value>>1;
pos++;
}
return pos;
}

 

 

 



我们把这个位置记为pos



3、然后再遍历一次数组,把这个数组分成两个子数组,pos位上为1的,和pos位上为0的



 

for(i=0; i<length; i++)
{	
if (testBit(date[i], pos))
{    
*num1 ^= date[i];
}
else
{
*num2 ^= date[i];
}
}

 

这里借助了异或的原理,pos位置上为1的其它成双成对的数肯定也是为1的,同理,pos位上为0的时也一样。

上面程序思路是我参考别人思路编写的代码,欢迎大家提出好的思路,一起学习一起进步!

标签:...,两个,int,位置,pos,value,数组,return
From: https://blog.51cto.com/u_2650279/6424101

相关文章

  • 【HarmonyOS】关于 Caused by java.lang.IllegalStateException The specified...
    【问题描述】线上收到大量手机的崩溃异常,以华为手机为主,崩溃如下1.Causedby:java.lang.IllegalStateException:Thespecifiedmessagequeuesynchronizationbarriertokenhasnotbeenpostedorhasalreadybeenremoved.2.atandroid.os.MessageQueue.removeSyncBarri......
  • GYM100212B - I Just Called...
    大模拟。首先的难度在于理解题意:打电话的地点分为镇、地区、超级地区三级。其中,一些地区是被网络连接的。电话号码的前缀由地区号+镇号组成。它们可以是不等长的,但是整个电话号码的长度是\(d\)。一个镇可能有多个镇号,不同地区的镇可以拥有相同的镇号,但地区号是唯一的。同时......
  • 6.10 对象数组
    demo1对象数组,静态初始化classPerson{privateStringname;privateintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}publicStringgetInfo(){return"姓名:"+this.name+"......
  • 基础必会必考点 Java数组
    Java数组连续存储的元素集合<fontface="楷体">个人认为Java中的数据即C++、C语言相同,一定是连续分配的。笔者在C语言教材找到这样一段话可以证明:Allelementsofaone-dimensionalarrayarealwaysstoredinconsecutivememorylocations.数组定义非初始化:int[]a1;初始化:......
  • main(...) 函数
                                              《目录》      最小的main()函数形参返回值获取main()函数的返回值argcAND argv最小的main()函数intmain(){}//默认返回......
  • 数组和双指针框架
    数组和双指针框架快慢指针:有序数组/链表原地去重、数组/链表原地删除快慢窗口指针:在限定条件下找最长/短的连续子序列/子串/子数组左右最值指针:缩减一维/二维有序搜索空间 快慢指针:有序数组/链表原地去重、数组/链表原地删除题目:26.删除有序数组中的重复项核心模式:数组已经排序......
  • 两个变量交换的四种方法(Java)
     对于两种变量的交换,我发现四种方法,下面我用Java来演示一下。1.利用第三个变量交换数值,简单的方法。(代码演示一下)classTestEV2//创建一个类3{4publicstaticvoidmain(String[]args)5{6intx=5,y=10;//定义两个变量78......
  • 两个变量交换的四种方法(Java)
     对于两种变量的交换,我发现四种方法,下面我用Java来演示一下。1.利用第三个变量交换数值,简单的方法。(代码演示一下)classTestEV2//创建一个类3{4publicstaticvoidmain(String[]args)5{6intx=5,y=10;//定义两个变量78......
  • 安装两个或多个jdk的骚操作
    准备先安装两个jdk,我安装的是jdk8和17下载可去官网,下面这个是老版本下载路径https://www.oracle.com/java/technologies/downloads/archive/我下载后进行了默认安装,可以修改,安装路径不要出现中文jdk17默认没有jre,可以使用下面的命令安装bin\jlink.exe--module-pathjmods......
  • pymysql.err.DataError: (1366, “Incorrect string value: ‘\\xF0\\x9F\\x92
    原因是字符串中有emoji数据。原因:字符串中有emoji字符,数据库是utf8无法识别解决方法:安装emoji库pipinstallemoji处理字符串:importemojis=emoji.demojize('......