牛客網——陣列中只出現一次的數字
阿新 • • 發佈:2018-11-02
題目描述
一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。
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]; } } }
真的很贊