乙個整型陣列裡除了兩個數字之外,其他的數字都是出現了兩次。請寫出程式找出這兩個只出現了一次的數字。要求時間複雜度是o(n), 空間複雜度是o(1)。
tip1:如果該陣列a中只有乙個數字出現了一次,其他的數字都出現了兩次,那麼求出該數字就很簡單,其值就是 a[0] ^ a[1] ^ … ^ a[n-1]
因此就需要想辦法,將問題轉換為tip1裡的問題場景。
tip2:將題目中的陣列的每個數字都異或,求得值為x,那麼實際上x就是該陣列中那兩個僅出現了一次的數字的異或值。
假設x的第k為1,那麼將原陣列中所有的數字按照第k位是否為1,進行劃分為兩個陣列。
然後對兩個陣列,分別實行tip1的解法即可。因為每個子陣列中,都存在乙個僅出現一次的數字,其餘的數字都出現兩次。
#include
#include
#include
#include
#include
#include
using namespace std;
class solution
int x1 = 0, x2 = 0;
for (int i = 0; i < left; i++) x1 ^= a[i];
for (int i = left; i < n; i++) x2 ^= a[i];
printf("x1:%d, x2:%d\n", x1, x2);
}void swap(int a, int i, int j)
};
int main() ;
solution solution;
solution.solve(a, sizeof(a)/sizeof(int));
return 0;
}
演算法 陣列中只出現一次的數字
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1示例 2 輸入 4,1,2,1,2 輸出 4 我能想到的第乙個方法就是把所有的值當成 map...
初級演算法 陣列 五 只出現一次的數字
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。示例 輸入 2,2,1 輸出 1 include include include using namespace std class solution return nums nums.size 1...
陣列中只出現一次的數字
何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。輸入 每個測試案例包括兩行 第一行包含乙個整數n,表示陣列大小。2 n 10 6。第二行包含n個整數,表示陣列元素,元素均為int。輸...