在整形陣列中找到只出現一次的兩個整數
阿新 • • 發佈:2021-12-06
一個整型陣列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]
都是稍微變化了一些,還是通過異或就可以解決了。