leetcode Single Number III

在《劍指offer》上有該題目的詳細解答:

題意爲給定一個整數數組,其中有兩個數只出現一次,其餘數出現兩次。要求線性時間、常量空間找出這兩個數。

我們知道,兩個相等的數異或結果爲0。因此,首次掃描數組,得到兩個單獨的數A、B的異或結果AxorB。因爲A和B不相等,因此AxorB一定不爲0,且二進制位爲1的位A和B一定不同。任取AxorB中某一位爲1的位,可以將原數組元素分成兩組異或即得結果。這裏取從最低位到最高位爲1的位(low to high)

這裏注意:java常用字節

1.整型
類型              存儲需求     bit數    取值範圍      備註
int                 4字節           4*8 
short             2字節           2*8    -32768~32767
long              8字節           8*8
byte              1字節           1*8     -128~127

2.浮點型
類型              存儲需求     bit數    取值範圍      備註
float              4字節           4*8                  float類型的數值有一個後綴F(例如:3.14F)
double          8字節           8*8                       沒有後綴F的浮點數值(如3.14)默認爲double類型

3.char類型
類型              存儲需求     bit數     取值範圍      備註
char              2字節          2*8

4.boolean類型
類型              存儲需求    bit數    取值範圍      備註
boolean        1字節          1*8      false、true


public int[] singleNumber(int[] nums) {
		int[] ans = new int[2];
		ans[0] = 0;
		ans[1] = 0;
		int res = 0;
		for(int i = 0;i < nums.length; ++i){
			res ^= nums[i];
		}
		
		int index = getFirstOneBit(res);
		
		for(int i = 0;i < nums.length;++i){
			if(isBit1(nums[i],index)){
				ans[0] ^= nums[i];
			}else{
				ans[1] ^= nums[i];
			}
		}
		return ans;
	}
	
	public boolean isBit1(int num,int index) {
		num = num >> index;
		return ((num & 1) == 1);
	}
	
	//low to high find the one digit;
	//取的是最低位數,如果一開始爲0,直接就是1了。
	public int getFirstOneBit(int num) {
		int indexBit = 0;
		while((num & 1) == 0 && (indexBit < 32)){
			//>>代表除以2;
			num = num >> 1;
			++indexBit;
		}
		return indexBit;
	}



發佈了39 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章