一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
思路:
遍历,创建字典存放次数
然后输出为1的
# -*- coding:utf-8 -*-
class Solution:
# 返回[a,b] 其中ab是出现一次的两个数字
def FindNumsAppearOnce(self, array):
# write code here
dict={}
for i in array:
if i not in dict:
dict[i]=1
else:
dict[i]+=1
res=sorted(dict.items(),key=lambda x:(x[1],x[0]))#排序
result=[res[0][0],res[1][0]]
return result
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
import java.util.*;
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
HashMap<Integer,Integer> map=new HashMap<>();
num1[0]=0;
num2[0]=0;
for(int i=0;i<=array.length-1;i++){
if(!map.containsKey(array[i])) map.put(array[i],1);
else map.replace(array[i],2);//存在,则直接计数为2
}
for(Map.Entry<Integer,Integer> m : map.entrySet()){
if(m.getValue()==1){
if (num1[0]==0) num1[0]=m.getKey();//先赋值给num1,再给num2
else num2[0]=m.getKey();
}
}
}
}
思路:
1.如果只array存在两个数,array[0],array[1]
2.利用异或,相同的数异或后为0,0与一个数异或仍为那个数;
从0开始异或,得到不同的两个数A,B的异或值
3.找到异或值的第一个1的索引index
4.根据index将数组分为该位为1和不为1的两组数(相同的数肯定分到同一组),分别异或,得到的就是这两个不同的数
# -*- coding:utf-8 -*-
class Solution:
# 返回[a,b] 其中ab是出现一次的两个数字
def FindNumsAppearOnce(self, array):
# write code here
length=len(array)
if length==2:
a=array[0]
b=array[1]
return [a,b]
bitresult=0
a,b=0,0
for i in range(len(array)):
bitresult^=array[i]
index=self.findFirst1index(bitresult)
for i in range(len(array)):
if self.isBit1(array[i],index):
a^=array[i]
else:
b^=array[i]
return [a,b]
def findFirst1index(self,bitresult):#找到从低位到高位第一个为1的位的索引
index=0
while((bitresult&1)==0 and index<32):
bitresult>>=1
index+=1
return index #最低位的数
def isBit1(self,target,index):#判断数的索引位是否为1,来分组异或
target=target>>index
return target&1
public class Solution {
public void FindNumsAppearOnce(int[] array, int[] num1, int[] num2) {
int length = array.length;
if(length == 2){
num1[0] = array[0];
num2[0] = array[1];
return;
}
int bitResult = 0;
for(int i = 0; i < length; ++i){
bitResult ^= array[i];
}
int index = findFirst1(bitResult);
for(int i = 0; i < length; ++i){
if(isBit1(array[i], index)){
num1[0] ^= array[i];
}else{
num2[0] ^= array[i];
}
}
}
private int findFirst1(int bitResult){
int index = 0;
while(((bitResult & 1) == 0) && index < 32){
bitResult >>= 1;
index++;
}
return index;
}
private boolean isBit1(int target, int index){
return ((target >> index) & 1) == 1;
}
}