練習題31(兩道差不多類型的題目) -缺失數字和只出現一次的數字

題目一:
給定一個包含 0, 1, 2, …, n 中 n 個數的序列,找出 0 … n 中沒有出現在序列中的那個數。
示例 1:
輸入: [3,0,1]
輸出: 2

示例 2:
輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8

思路:
將數組中的數字用下標進行抵消,最後剩下的就是缺失的數字。
0 ^ 4 = 4
4 ^ 4 = 0
11223 = 3

代碼:

class Solution {
public:
int missingNumber(vector<int>& nums) {
    int res = nums.size();
    for (int i = 0; i < nums.size(); ++i){
        res ^= nums[i];
        res ^= i;
    }
    return res;
}

};

題目二:
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

說明:

你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,1]
輸出: 1
示例 2:

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

思路:
將第一個數字和後面每一個數字異或,然後最後得到的結果就是沒有出現在序列中的那個數(相同的數字異或爲0,所以最後這些數字異或之後剩下的就是隻有一個的數字)

代碼:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
    int a = 0, i;
    for (i = 0; i < nums.size(); ++i)
    {
        a = a ^ nums[i];
    }
    return a;
    }
};

練習題30-旋轉數組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章