1. 程式人生 > 實用技巧 >LeetCode丟失的數字Swift

LeetCode丟失的數字Swift

給定一個包含 [0, n]中n個數的陣列 nums ,找出 [0, n] 這個範圍內沒有出現在陣列中的那個數。

進階:

你能否實現線性時間複雜度、僅使用額外常數空間的演算法解決此問題?

示例 1:

輸入:nums = [3,0,1]
輸出:2
解釋:n = 3,因為有 3 個數字,所以所有的數字都在範圍 [0,3] 內。2 是丟失的數字,因為它沒有出現在 nums 中。


示例 2:

輸入:nums = [0,1]
輸出:2
解釋:n = 2,因為有 2 個數字,所以所有的數字都在範圍 [0,2] 內。2 是丟失的數字,因為它沒有出現在 nums 中。


示例 3:

輸入:nums = [9,6,4
,2,3,5,7,0,1] 輸出:8 解釋:n = 9,因為有 9 個數字,所以所有的數字都在範圍 [0,9] 內。8 是丟失的數字,因為它沒有出現在 nums 中。


示例 4:

輸入:nums = [0]
輸出:1
解釋:n = 1,因為有 1 個數字,所以所有的數字都在範圍 [0,1] 內。1 是丟失的數字,因為它沒有出現在 nums 中。

提示:

n == nums.length
1 <= n <= 104
0 <= nums[i] <= n
nums 中的所有數字都 獨一無二

思路一:數學計算(1、2、3、4......n 求和公式為 S = n * (A1 + An) / 2)

class Solution {
    func missingNumber(_ nums: [Int]) -> Int {
        let aMax = nums.count
        let Sum = (1 + aMax) * aMax / 2
        let arraySum = nums.reduce(0, +)
        return Sum - arraySum
    }
}

思路二:按位異或(下標的位置理應是下標那個值,如果值=下標,兩個異或為0)

class Solution {
    func missingNumber(_ nums: [Int]) 
-> Int { var aMax = nums.count for i in 0..<nums.count { aMax = aMax^i^nums[i] } return aMax } }