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...