快轉到主要內容

CSES-1083 Missing Number

目錄

題目連結:https://cses.fi/problemset/task/1083


題意
#

題目給定一個包含 \( n - 1 \) 個數字的數列。
這些數字原先範圍為 \( 1 \) 到 \( n \),其中少了一個數。
要求找出缺少的數字。

思路
#

除了開陣列紀錄數字,我們也可以利用 XOR(互斥或)的特性。
兩個相同的數字進行 XOR 運算會變成 0。

我們準備一個變數,與 \( 1 \) 到 \( n \) 的所有數字作 XOR,
再與輸入的 \( n - 1 \) 個數字作 XOR。

有出現的數字會被 XOR 兩次而抵銷歸零。
缺少的數字只會被作 XOR 一次,
最後變數留下的值就是答案。

程式碼
#

#include <bits/stdc++.h>
using namespace std;
#define WA() cin.tie(0)->sync_with_stdio(0)
#define int long long

signed main() { WA();
    int n, xr = 0; // xr 用來做位元 XOR 運算,初始值為 0
    cin >> n; // 讀取數列預期長度 n
    
    vector<int> v(n-1);
    for (auto &i : v) cin >> i; // 讀取缺了一個數字的數列
    
    // 同時與陣列元素以及 1~n-1 進行 XOR 運算
    for (int i = 0; i < n-1; i++) {
        xr ^= v[i]; // XOR 原有陣列內的數字
        xr ^= i+1;  // XOR 1 到 n-1 之間的數字
    }
    xr ^= n; // 最後補上數字 n 進行 XOR
    
    cout << xr; // 經過成對抵銷後,殘留下來的 xr 就是不見的數字
}

Piau 的筆記本
作者
Piau 的筆記本
希望我寫下來的東西能夠長久的記在我的腦中