🌗 268. 丢失的数字

吞佛童子2022年10月10日
  • algorithm
  • Number
小于 1 分钟

🌗 268. 丢失的数字

难度: 🌗

问题描述

img_15.png


解法 1 - 原地 hash

class Solution {
    public int missingNumber(int[] nums) {
        // 思路:
        // 遍历
        int len = nums.length;
        int index = 0;
        while(index < len) {
            if(nums[index] == index || nums[index] == len) {
                index ++;
            } else {
                swap(nums, index, nums[index]);
            }
        }
        // 再次遍历,求缺失
        for(int i = 0; i < len; i ++) {
            if(nums[i] != i) {
                return i;
            }
        }
        return len;
    }

    private void swap(int[] nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }
}

输出 1

img_14.png


解法 2 - 位运算

class Solution {
    public int missingNumber(int[] nums) {
        // 思路:
        // [0, n] 中只有一个元素没有出现,那么再加上 [0, n]后,变为 [0, n] 中只有一个数出现过一次
        int len = nums.length;
        int tmp = 0;
        for(int i = 0; i <= len; i ++) {
            tmp ^= i;
        }
        for(int i: nums) {
            tmp ^= i;
        }
        return tmp;
    }
}

输出 2

img_16.png


解法 3 - 数学

class Solution {
    public int missingNumber(int[] nums) {
        // 思路:
        // [0, n] 所有元素和 == (len + 1) * len / 2
        int len = nums.length;
        int sum = 0;
        for(int i : nums) {
            sum += i;
        }
        return (len + 1) * len / 2 - sum;
    }
}

输出 3

img_17.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou