1. 程式人生 > >牛客網——陣列中只出現一次的數字

牛客網——陣列中只出現一次的數字

題目描述
一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。

1實在沒想到什麼好的解決方法,就用TreeSet解決,因為底層是紅黑樹實現,增加,刪除結點是logn,所以複雜度為O(nlogn)

package 劍指offer;

import java.util.TreeMap;
import java.util.TreeSet;

/**
 * Created by Administrator on 2018/10/28.
 */
public class 陣列中只出現一次的數字 {
    public void FindNumsAppearOnce
(int [] array,int num1[] , int num2[]) { TreeSet<Integer> set=new TreeSet<>(); for(int i=0;i<array.length;i++){ if(set.contains(array[i])) set.remove(array[i]); else set.add(array[i]); } boolean a=false; for
(int num:set){ if(!a) num1[0]=num; else num2[0]=num; a=true; } } }

討論區看的一位大佬的做法,用的很巧妙複雜度為O(n)
首先考慮只有一個的情況,其他都是2個相同的,所有數字異或後就是這個數
如果是2個數,所有數字異或後的為1的最低位,可以與陣列中與該數異或後是否為1,分為2部分,2部分各自異或就是這兩個數。

public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        if(array.length < 2) return ;
        int myxor = 0;
        int flag = 1;
        for(int i = 0 ; i < array.length; ++ i )
            myxor ^= array[i];
        while((myxor & flag) == 0) flag <<= 1;
       // num1[0] = myxor;
        //num2[0] = myxor;
        for(int i = 0; i < array.length; ++ i ){
            if((flag & array[i]) == 0) num2[0]^= array[i];
            else num1[0]^= array[i];
        }
    }
}

真的很贊