数组中只出现一次的数字

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012017783/article/details/80320227

这里写图片描述

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
import java.util.*;
public class Solution {
     //解法一:暴力匹配
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]){
       if(array==null||array.length==0||array.length==1)
             return;
        HashMap <Integer,Integer>map=new HashMap<>();
        for (int i=0;i!=array.length;i++ ) {
             if(!map.containsKey(array[i]))
             {
                   map.put(array[i],1);
             }else{
                   map.put(array[i],2); 
             }
        }
        boolean first=true;
        for(int k:map.keySet()){

             if(map.get(k)==1&&first)
             {
                 num1[0]=k;
                 first=false;
                 continue;
             }
             if(map.get(k)==1)
             {
                 num2[0]=k;
             }
        }
        System.out.println(num1[0]);
        System.out.println(num2[0]);
    }

    //解法二: 按位运算,优化后的解法
    public void FindNumsAppearOnce2(int [] array,int num1[] , int num2[]) {
        if(array==null||array.length==0||array.length==1)
             return;
        int sum=array[0];
        for(int i=1;i!=array.length;i++){
            sum^=array[i];
        }
        int index=0;
        for(;index!=32;index++){
              if((sum&(1<<index))!=0) break;
        }
        for(int i=0;i!=array.length;i++){
            if((array[i]&(1<<index))!=0){
                num2[0]^=array[i];
            }else{
                num1[0]^=array[i];
            }
        }
        System.out.println(num1[0]);
        System.out.println(num2[0]);

    }

    public static void main(String[]args){
        //System.out.println("Hello");
        int[]arr={2,2,3,3,4,5,6,6};
        int[]num1=new int[1];
        int[]num2=new int[1];
        Solution s=new Solution();
        s.FindNumsAppearOnce2(arr,num1,num2);
    }
}

这里写图片描述

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页