1. 程式人生 > 其它 >在整形陣列中找到只出現一次的兩個整數

在整形陣列中找到只出現一次的兩個整數

一個整型陣列nums裡除兩個數字之外,其他數字都出現了兩次。

請寫程式找出這兩個只出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1)。

輸入:nums = [4,1,4,6]
輸出:[1,6] 或 [6,1]

程式碼:

#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
        int a=0,b=0,c=0
,d=1; for(int i=0;i<nums.size();i++)//通過異或找到只出現一次的兩個整數的異或結果 { a^=nums[i]; } while((a&d)==0)//兩個不同數字至少有一個二進位制位不同,而那個二進位制位的 { //異或結果為1,所以找到那個二進位制位為1,其餘為0的整數 d<<=1; // } for(int i=0;i<nums.size();i++) {
if((nums[i]&d)==0)//以該二進位制位將原陣列分為兩組,最後異或的結果也就是原來的兩個整數了 { b^=nums[i]; } else { c^=nums[i]; } } vector<int> v; v.push_back(b); v.push_back(c); return v; } };

類似的,比如

定一個數組,包含從 1 到 N 所有的整數,但其中缺了兩個數字。你能在 O(N) 時間內只用 O(1) 的空間找到它們嗎?

以任意順序返回這兩個數字均可。

輸入: [2,3]
輸出: [1,4]

都是稍微變化了一些,還是通過異或就可以解決了。