筆試題 只出現一次的數

2021-09-07 01:51:29 字數 1325 閱讀 8091

1、給定一陣列,陣列中的數字均為int型別,除了乙個數出現一次,其他都出現了兩次,請找出這個數;

2、給定一陣列,陣列中的數字均為int型別,除了乙個數出現一次,其他都出現了三次,請找出這個數;

這兩道題,最容易想到的方法就是通過hashmap統計或者先排序後遍歷的方法,但它們要麼需要的空間複雜度高,要麼時間複雜度高。

有沒有一種方法,空間複雜度為常數,時間複雜度為o(n)?

其實兩道題都可以通過位運算的簡單方法來得到結果。

題目1:

相同的數異或等於0,因此將陣列中所有的數全部進行異或操作,那麼得到就是不重複出現的那個數。

這個思想可以應用於:乙個數出現一次,其他都出現了偶數次。

題目2:

方法1:

建立乙個長度為sizeof(int) 的陣列count[sizeof(int)],count[i] 表示在在i 位出現的1 的次數。如果count[i] 是3 的整數倍,則忽略;否則就把該位取出來組成答案。

方法2:

用one 記錄到當前處理的元素為止,二進位制1 出現「1 次」(mod 3 之後的1)的有哪些二進位制位;用two 記錄到當前計算的變數為止,二進位制1 出現「2 次」(mod 3 之後的2)的有哪些二進位制位。當one 和two 中的某一位同時為1 時表示該二進位制位上1 出現了3 次,此時需要清零。即用二進位制模擬三進製運算。最終one 記錄的是最終結果。

題目1:

int singlenumberi(int* a,int n)

}int result=0;

for(int i=0;i總的**:

#include #include using namespace std;

int singlenumberi(int* a,int n)

}int result=0;

for(int i=0;ireturn result;

}int singlenumberii(int* a,int n)

return one;

}int main()

; int lena=sizeof(a)/sizeof(a[0]);

cout << singlenumberi(a,lena) << endl;

int b=;

int lenb=sizeof(b)/sizeof(b[0]);

cout << singlenumberii(b,lenb) << endl;

cout << singlenumberiii(b,lenb) << endl;

return 0;

}

只出現一次的數

給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其他所有元素均出現兩次。找出只出現一次的那兩個元素。示例 給定 nums 1,2,1,3,2,5 返回 3,5 注意 結果的順序並不重要,對於上面的例子 5,3 也是正確答案。你的演算法應該具有線性複雜度,你能否僅使用恆定的空間複雜度來實現它...

只出現一次的數

問題描述 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。解決思路 將陣列中元素全部異或,根據異或特點,出現兩次的元素異或後結果為0,陣列全部異或之後的結果就是只出現一次的那個元素。實現 int singlenumber vector int n...

只出現一次的數

問題 有n個數,其中只有乙個數出現一次,其他的都出現兩次,求這個數 空間複雜度為常數 全部xor起來即可 include includeusing namespace std int main printf d n xor sum return 0 1231 3 1 51 2 3 2 3 inclu...