题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
因为空间复杂度是1.。。。。不能用HashMap
异或运算的性质:任何一个数字异或它自己都等于0
简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字
有了上面简单问题的解决方案之后,我们回到原始的问题。如果能够把原数组分为两个子数组。在每个子数组中,包含一个只出现一次的数字,而其他数字都出现两次。如果能够这样拆分原数组,按照前面的办法就是分别求出这两个只出现一次的数字了。
有了上面简单问题的解决方案之后,我们回到原始的问题。如果能够把原数组分为两个子数组。在每个子数组中,包含一个只出现一次的数字,而其他数字都出现两次。如果能够这样拆分原数组,按照前面的办法就是分别求出这两个只出现一次的数字了。
我们还是从头到尾依次异或数组中的每一个数字,那么最终得到的结果就是两个只出现一次的数字的异或结果。因为其他数字都出现了两次,在异或中全部抵消掉了。由于这两个数字肯定不一样,那么这个异或结果肯定不为0,也就是说在这个结果数字的二进制表示中至少就有一位为1。我们在结果数字中找到第一个为1的位的位置,记为第N位。现在我们以第N位是不是1为标准把原数组中的数字分成两个子数组,第一个子数组中每个数字的第N位都为1,而第二个子数组的每个数字的第N位都为0。(这两个数字不同,意味着为1的那个位是相异的)
public void findNum(int[] arr){
int result = 0;
for(int i=0;i<arr.length;i++){//异或结束相当于两个数异或的结果
result ^= arr[i];
}
//找出这两个数的第一个相异位置
int count =1;
int i=1;
while(true){
if(result&i==1){
break;
}
result>>1;
count<<1;
}
//按照这个位置把数组分成两组
int num1 = 0;
int num2 = 0;
for(int i=0;i<arr.length;i++){
if(arr[i]&count==0){
num1 ^= arr[i];
}else{
num2 ^= arr[i];
}
}
System.out.println("num1="+num1+" num2="+num2);
}
分享到:
相关推荐
通过这样的位操作,我们可以在不使用额外的数据结构或排序的情况下,有效地找出数组中三个只出现一次的数字。这种方法充分利用了位操作的高效性,是解决这类问题的经典算法之一。在实际的面试或编程竞赛中,掌握这类...
### 知识点四:找出数组中两个只出现一次的数字 #### 题目描述 - 给定一个数组,除了有两个元素只出现一次之外,其余元素均出现两次。找出这两个只出现一次的数字。 - **示例**: - 输入数组:`[4, 1, 2, 1, 2]` ...
13. **第一个只出现一次的字符**:找出字符串中第一个只出现一次的字符,可以使用哈希表记录字符出现次数,然后遍历查找。 14. **圆圈中最后剩下的数字**:多人围成一圈按顺序报数,报到特定数的人离开,直到只剩一...
面试题15:在二元树中找出和为某一值的所有路径 第11章 排序 11.1 插入排序 面试题1:编码实现直接插入排序 面试题2:编码实现希尔(Shell)排序 11.2 交换排序 面试题3:编码实现冒泡排序 面试题4:编码实现快速...
**例题2:** 给定一个整数数组,请找出其中任意两个数相加之和等于给定目标值的情况。 - **解题思路:** 使用哈希表记录每个元素值及其下标,遍历数组时检查目标值减去当前元素值的结果是否存在于哈希表中。 - **...
- **详细解释**: 给定一个字符串,如"ababc",任务是找出该字符串中最长连续重复子串。在这个例子中,"ab"是连续重复出现且最长的子串。 - **解决方案**: 可以遍历字符串并检查每个子串是否连续重复出现,同时记录...
首先,迅雷笔试题中包含了多道编程和算法相关的面试题目,这里着重解析两个较为复杂的编程题目: 1. 如何将90%的查询在100毫秒内完成? 这是一个典型的性能优化问题。对于数据库查询,通常有以下几种优化手段: -...
5. 选择题5中,两个字符串s1和s2都指向同一个字符串常量"bbbb",在Java中,相同的字符串字面量会共用一个对象,所以创建的对象数是1,答案是D.1。 简答题: 1. ArrayList、Vector和LinkedList都是Java中的集合类。...
根据提供的文件信息,我们可以整理出以下相关知识点: ### 1. Switch Case 结构与 Break 语句 **知识点概述:** 在 Java 中,`switch` 语句用于基于不同的条件执行不同的代码块。如果 `case` 后面的条件满足,则...
【微软编程面试100题】是一系列针对程序员面试的挑战题目,涵盖了数据结构和算法等领域,旨在评估候选人的编程能力和逻辑思维。以下是其中几道题目的解析: 1. **二元查找树转双向链表**: 这道题要求将一个二元...
10. 有个数组 a[100]寄存了 100 个数,这 100 个数取自 1-99,且只有两个相似旳数,剩余旳 98 个数不一样,写一种搜索算法找出相似旳那个数旳值。(注意空间效率时间效率尽量要低)。 知识点:搜索算法、数组操作。 ...
题目要求合并两个已排序的数组,并找出合并后数组的中位数。 #### 解决方案 1. **双指针法**:同时遍历两个数组,比较当前元素的大小进行合并。 2. **优化比较次数**:由于数组已经排序,可以采用二分查找等方法...
分解质因数是找出一个正整数的所有质数因子。程序通过不断尝试2到n的每个数作为因子,如果可以整除,就更新n并继续分解。这个过程一直持续到n变为1,表示分解完成。 5. **条件运算符**: 条件运算符(三元运算符...
超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...
标题《数据结构+算法100题》和描述《数据结构,算法,面试题,经典100题。准备找工作的程序员必看》明确指出了文件内容的核心知识点,即是关于数据结构和算法的面试准备。文件内容提到的题目是把二元查找树(BST,...