题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是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]` ...
要求找出数组中连续的一个或多个整数(即一个子数组)使得这些数的和最大,并返回这个最大的和。需要注意的是,算法的时间复杂度必须为 O(n)。 #### 示例 假设输入的数组为 [1, -2, 3, 10, -4, 7, 2, -5],则最大和...
面试题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 个数不一样,写一种搜索算法找出相似旳那个数旳值。(注意空间效率时间效率尽量要低)。 知识点:搜索算法、数组操作。 ...
抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类...
题目要求合并两个已排序的数组,并找出合并后数组的中位数。 #### 解决方案 1. **双指针法**:同时遍历两个数组,比较当前元素的大小进行合并。 2. **优化比较次数**:由于数组已经排序,可以采用二分查找等方法...
分解质因数是找出一个正整数的所有质数因子。程序通过不断尝试2到n的每个数作为因子,如果可以整除,就更新n并继续分解。这个过程一直持续到n变为1,表示分解完成。 5. **条件运算符**: 条件运算符(三元运算符...
超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...
标题《数据结构+算法100题》和描述《数据结构,算法,面试题,经典100题。准备找工作的程序员必看》明确指出了文件内容的核心知识点,即是关于数据结构和算法的面试准备。文件内容提到的题目是把二元查找树(BST,...