一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数,要求算法的时间复杂度为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的时也一样。
上面程序思路是我参考别人思路编写的代码,欢迎大家提出好的思路,一起学习一起进步!
相关推荐
根据给定文件的信息,我们可以将相关的知识点分为两个部分来详细阐述: ...以上就是从给定的文件中提取的相关知识点,包括了求解整数数组中任意两个元素之差的最大值以及求解整数数组中出现次数最多的数的详细解答。
给定一个非空整数数组,除了某个元素只出现一次外,其余每个元素均出现两次。找出那个只出现一次的元素。找出只出现一次的数字。 前提:你的算法应该具有线性的时间复杂度。
在C++编程中,有时我们需要找出一个整数数组中的最大值和次大值。这个问题在很多实际应用中都有所体现,比如数据处理、算法分析等。本篇文章将详细讲解如何通过自定义函数来实现这个功能,特别关注的是找出数组中的...
在这个编程任务中,我们需要在C语言环境下实现一个程序,该程序能从用户那里接收两个整数,然后在它们之间找出所有的素数,并显示出来。素数是大于1且只有1和其本身两个正因数的自然数。这里,我们不仅需要实现基本...
【输入形式】 从标准输入读取输入。第一行只有一个数字N(1≤N≤10000),代表整数的个数。以后的N行每行有一个整数。 【输出形式】 向标准输出打印出现次数...输入6个整数,其中出现次数最多的是0,共出现两次。
这个程序分为两个主要部分,首先是定义了一个用于判断水仙花数的函数isArmstrong,然后在主函数main中通过用户输入指定搜索范围,程序会输出这个范围内的所有水仙花数。 下面是程序中一些关键知识点的详细说明: 1...
5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序输出 5.3 将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。 5.4 试编写一程序,要求比较两个字符...
给定一个整数数组,返回两个数字的索引,使它们相加为特定目标。 您可以假设每个输入都只有一个解决方案,并且您不能两次使用相同的元素。 例子: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums...
题目 "只出现一次的数字(分组+异或)1" 是 LeetCode 上的一个经典算法问题,要求在给定的整数数组 `nums` 中找出仅出现一次的两个元素。数组中其他元素均出现两次,返回这两个单次出现的元素,顺序不限。此题的关键...
根据给定文件的信息,本文将探讨如何找到最小的正整数,该整数可以被1到20中的每一个数字整除。这个问题源自于一个著名的数学挑战项目——Project Euler中的问题5(Problem 5)。首先,我们将对问题进行简要概述,并...
标题 "1-n中缺失2个数字,O(n)时间内找出它们" 描述的是一个经典的算法问题,它要求在已排序的数组(从1到n,但缺失了两个数字)中,找出这两个缺失的数字,而目标是在线性时间复杂度O(n)内完成。这个问题在计算机...
这道问题要求从给定的非空整数数组中找出唯一出现一次的元素,而其他所有元素都出现两次。它涉及到对数组操作的高效处理,以及巧妙运用位运算,特别是异或操作。 首先,我们需要理解异或(XOR)运算的基本性质。在...
给定一个整数数组`nums`和一个整数`target`,我们要找到数组中两个不重复的元素,它们的和等于`target`。返回这两个元素的索引,顺序不限。因为数组中元素不能重复出现,所以每个元素只能使用一次。 为了高效地解决...
循环数是那些不包括0且没有重复数字的整数(比如81362)并且还应同时具有一个有趣的性质, 就像这个例子:如果你从最左边的数字开始(在这个例子中是8)向右数最左边这个数(如果数到了最右边就回到最左边),你会停止在另一...
本篇内容旨在通过一个具体的实例——从键盘输入一组整数,并利用分治算法找出这组整数中的第二大数——来深入理解分治算法的设计思路及其应用方法。 #### 分治算法原理 分治算法通常包括三个步骤: 1. **分解**:...
在给定的编程问题中,我们面临一个名为“Lonely Number”的挑战,即在一个整数数组中找到唯一出现一次的数字。这个问题的核心是利用数组特性,尤其是考虑到题目中提到的每个数字其他都出现三次,只有一个数字出现一...
游戏通常由两个或更多玩家参与,每个人每次可以报出1到10之间的任意整数,但不能重复前一个人说过的数字。目标是通过所有人的数字相加,使得总和达到30。如果最后一个说出数字的人使得总和超过30,那么该玩家就输了...
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? ...
在LeetCode中,这个问题被称为“Single Number”,其描述是:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。这是一个基础的位操作问题,要求在不使用...
这道LeetCode中的算法问题主要考察的是在给定整数数组`nums`中,找到唯一一个只出现一次的数字,而其他所有数字都出现两次。解决这个问题涉及到几种不同的策略,包括排序、数学计算以及位运算。 ### 排列验证法 ...