数组中只出现一次的数字
来源:互联网 发布:matlab矩阵做聚类分析 编辑:程序博客网 时间:2024/04/25 16:50
思路:
(1)如果只有一个数字只出现一次,那么对所有数字做异或运算,由于一个数和自身做异或运算结果为0,而任何数字与0做异或运算结果为它本身,因此,最后的结果便是那个只出现一次的数。
(2)同样对所有数字做异或运算,结果应该是两个只出现一次的数字做异或运算的结果。由于这两个数字不同,因此结果非0。不妨假设结果的二进制表示中第index位非0,那么这两个唯一出现的数字在第index位上不同。从而可以根据这一位把数组中的所有元素分成两部分。这两个唯一出现的数字必然会被分开,并且,相同的两个数会被分在同一组。
(3)这样,便可以用(1)的方法取分别求出这两个数字,边分组,边异或运算的结果。注意,两个数均初始化为0,因为如果该组中唯一出现的数字不是0,显然能够得到结果,即使为0,由于0与0做异或运算也得到0,所以可是这么初始化。
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int temp = array[0];
for(int i = 1; i < array.length; i++)
temp ^= array[i];
int first1Index = 0;
while((temp & 0x1) != 1) {
temp >>= 1;
first1Index++;
}
int judge = (int) Math.pow(2, first1Index);
num1[0] = 0;
num2[0] = 0; // 因为0与任何数做异或运算都等于这个数本身,所以可以这样初始化。
for(int i = 0; i < array.length; i++) {
if((array[i] & judge) == 0)
num1[0] ^= array[i];
else
num2[0] ^= array[i];
}
}
}
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 微信支付H5调用支付详解
- JAVA中list,set,数组之间的转换详解
- Handler机制原理
- Jmeter3.0 Body Data 中文参数显示乱码的解决方式。
- git常用命令
- 数组中只出现一次的数字
- 单链表查找倒数第k个节点
- Java 自带的MD5加密。
- iTerm2+Oh_My_Zsh+Powerline
- 图结构练习——BFS——从起始点到目标点的最短步数
- PYTHON学习DAY1
- iOS UIActivityIndicatorView不能隐藏
- java list与数组之间的转换详细解析
- java动态之反射机制relection