剑指offer-41-数组中只出现一次的数字
数组中只出现一次的数字
http://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811
思路
- Set<integer> 集合</integer>
- 异或运算,异或有交换律,异或的结果是两个不同的数异或得到,通过这个数的二进制中某个1,对整个数组进行分组。分组之后可以转换为求一个数组中只有一个数字是1位的场景。
代码
Set集合
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
import java.util.*;
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
Set<Integer> arr=new HashSet<>();
for(int i=0;i<array.length;i++){
if(!arr.contains(array[i])){
arr.add(array[i]);
}else{
arr.remove(array[i]);
}
}
int p=0;
for(Integer i:arr){
if(p==0){
num1[0]=i;
p++;
}else{
num2[0]=i;
}
}
}
} 异或运算
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int res=0;
for(int i=0;i<array.length;i++){
res=res^array[i];
}
int p=0;
while((res&1)!=1){
res=res>>1;
p++;
}
int res1=0,res2=0;
for(int i=0;i<array.length;i++){
if(((array[i]>>p)&1)==1){
res1=res1^array[i];
}else{
res2=res2^array[i];
}
}
num1[0]=res1;
num2[0]=res2;
}
} 剑指offer与数据结构 文章被收录于专栏
本专栏包括剑指offer题目和一些刷题用的数据结构,单调栈,树状数组,差分数组,后面还会更新红黑树等较为复杂的数据结构