思路:1.將陣列的所有元素異或得到的結果為不存在重複的兩個元素異或的結果(很容易理解,如果陣列中的所有數字都出現了偶數次,那麼所有元素異或的結果一定為0);
2.兩個不相等的元素在位級表示上必定會有一位存在不同;
3.任何數和0異或的結果都是它本身;
個人分析如下:
設不存在重複的兩個元素分別為a和b,那麼a^b的結果就是陣列中所有元素異或的結果;
從最低位開始,找出a^b結果中的第乙個「1」,即a和b第乙個不相同位的索引indexof_1;
然後把陣列中所有元素按第indexof_1位是「1」還是「0」分為兩堆,每堆所有元素異或得到的結果就是最終要找的這兩個數。
#include
#include
using
namespace std;
//兩個不相等的元素在位級表示上必定會有一位存在不同
//將陣列的所有元素異或得到的結果為不存在重複的兩個元素異或的結果(很容易理解,如果陣列中的數字都出現了偶數次,那麼所有元素異或的結果一定為0)
class
solution
}private
://找到第乙個為1的位數,比如0100,第乙個為1的位數是2
unsigned
intfindfirstbitof1
(int num)
return index;
}//判斷第index位是否為1
leetcode的題的版本的答案:
class
solution
;int result_exclusiveor =0;
for(
int i =
0; i < length; i++
)unsigned
int index =
find_first_index_of_bit_1
(result_exclusiveor)
; vector<
int>res;
int temp1 =0;
int temp2 =0;
for(
int i =
0; i < length; i++
)else
} res.
push_back
(temp1)
; res.
push_back
(temp2)
;return res;
}int
find_first_index_of_bit_1
(int number)
//找到number中第乙個為1的位
return index;
}//判斷第index位是否為1
bool
isbit1
(int num,
unsigned
int index)
};
陣列中只出現一次
首先看看題目要求 陣列a中,除了某乙個數字 x之外,其他數字都出現了三次,而 x出現了一次。請給出最快的方法找到x。這個題目非常有意思,在本人部落格中有 位操作基礎篇之位操作全面總結 這篇文章介紹了使用位操作的異或來解決 陣列中其他數字出現二次,而x出現一次,找出x。有 這邊文章介紹了分組異或的方法...
刷題 陣列中只出現一次的數字
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。第一想法是用雜湊表,但其實浪費了空間。我們可以利用異或運算的特性,任何乙個數字異或自己都等於0。先考慮如果乙個陣列中只有乙個數字只出現一次,那麼只要從頭到尾依次異或陣列中的每乙個數字就能得到那個只出現了一次的...
程式設計題 陣列中只出現一次的數
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。num1,num2分別為長度為1的陣列。傳出引數 將num1 0 num2 0 設定為返回結果 先用亦或,相同則為0,不同則為1,最後得到的就是單獨的2個數的亦或,是2個數不同的位置,選第乙個1的位置,將陣列...