数组中只出现一次的数字

一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
思路:
遍历,创建字典存放次数
然后输出为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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值