演算法題1 陣列中唯一出現1次的數 唯一出現2次的數

2021-07-10 11:58:46 字數 1744 閱讀 3723

題目

乙個整型陣列裡除了1個數字之外,其他的數字都出現了兩次,請寫程式找出這個只出現一次的數字。要求時間複雜度是 o(n),空間複雜度是 o(1),例如輸入陣列{2, 4, 3, 3, 2, 5 },因為只有 4 這個數字只出現一次,其他數字都出現了兩次,所以輸出 4

分析

本題以及延伸題目,在劍指offer上有詳細描述。利用異或的特性,x^y^x=y^x^x=y。對陣列所有元素一次進行異或操作,最終得到的值就是那個只出現一次的數字

**

1

int findoncenum(int arr,int

len)27

8int ret=0;9

for(int i=0;i)10

1314

return

ret;

15 }

那麼,當陣列中有2個只出現1次的數字呢?例如輸入陣列{2, 4, 3, 3, 6, 2, 5 },因為4和6 這兩個數字都只出現一次,其他數字都出現了兩次,應輸出 4,6

思路分析

假設兩個只出現一次的數字分別為a、b,對陣列元素進行兩兩異或後得到的值為c,可知c=a^b。因為a和b一定不同,所以c不等於0,那麼c的二進位制表示中一定有一位是1,即a,b在此位上分別為0,1或1,0。假設該位置是從低位起第x位,那麼將陣列分成兩組,一組中的數字在第x位是0,另一組中的數字在第x位是1,則a和b分別屬於兩個子陣列。分別求子陣列中唯一只出現1次的數字,即可得到a和b

**

1

bool is_true_bit(int num,int

index)25

6void findoncenums(int arr,int

len)713

14int index=0;15

while (index<32)16

21 index++;22}

2324

int a=0,b=0;25

for(int i=0;i)

26else

3134}35

36 cout37 cout3839 }

延伸1:

如果要求陣列中唯一只出現1次的3個數字呢?

思路是一樣的,3個數字的二進位制表示中必有1位,乙個數字a在此位上是1,其他兩個數字b、c在此位上是0。先以此將陣列分為兩組,求出a,再求子陣列中唯一出現1次的兩個數字b和c。

延伸2:找出陣列中唯一出現兩次的數

假設你有乙個用1001個整數組成的陣列,這些整數是任意排列的,但是你知道所有的整數都在1到1000(包括1000)之間。此外,除乙個數字出現兩次外,其他所有數字只出現一次

分析

從題目中可以知道,這1001個整數是1到1000的連續整數(任意排列)加上乙個多出1次的任意數字(在1到1000之間)。那麼xor_num=1^2^3^···x···n-1^n,xor_num2=1^2^3^···x^x···n-1^n,將xor_num和xor_num2異或即可得到x

延伸3:找出陣列中唯一出現兩次的數(任意整數陣列)

乙個陣列,除了有1個數字出現2次外,其餘數字均出現1次,求出現2次的那個數字

本題只好用hash的記憶體方式記錄次數了,暫時沒想到好的方法

陣列中唯一出現1次的數 唯一出現2次的數

題目 乙個整型陣列裡除了1個數字之外,其他的數字都出現了兩次,請寫程式找出這個只出現一次的數字。要求時間複雜度是 o n 空間複雜度是 o 1 例如輸入陣列 2,4,3,3,2,5 因為只有 4 這個數字只出現一次,其他數字都出現了兩次,所以輸出 4 分析 本題以及延伸題目,在劍指offer上有詳細...

尋找陣列中唯一出現兩次的數

假設你有乙個用1001個整數組成的陣列,這些整數是任意排列的,但是你知道所有的整數都在1到1000 包括1000 之間。此外,除乙個數字出現兩次外,其他所有數字只出現一次。假設你只能對這個陣列做一次處理,用一種演算法找出重複的那個數字。如果你在運算中使用了輔助的儲存方式,那麼你能找到不用這種方式的演...

資料結構演算法題 尋找陣列中唯一出現兩次的數

假設你有乙個用1001個整數組成的陣列,這些整數是任意排列的,但是你知道所有的整數都在1到1000 包括1000 之間。此外,除乙個數字出現兩次外,其他所有數字只出現一次。假設你只能對這個陣列做一次處理,用一種演算法找出重複的那個數字。如果你在運算中使用了輔助的儲存方式,那麼你能找到不用這種方式的演...