leetcode 268. 缺失数字 & 面试题 17.04. 消失的数字 & 剑指 Offer 53 - II. 0~n-1中缺失的数字

【题目】268. 缺失数字 & 面试题 17.04. 消失的数字 & 剑指 Offer 53 - II. 0~n-1中缺失的数字

268. 缺失数字
448. 找到所有数组中消失的数字
给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
示例 1:

输入: [3,0,1]
输出: 2

示例 2:

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

说明:你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?

【解题思路1】排序

  • 0 没有出现在数组的首位,
  • n 没有出现在数组的末位。
  • 如果这两种特殊情况都不满足,那么缺失的数字一定在 0 和 nn 之间(不包括两者)。
class Solution {
    public int missingNumber(int[] nums) {
        Arrays.sort(nums);
        // 判断 n 是否出现在末位
        if (nums[nums.length-1] != nums.length) {
            return nums.length;
        }
        // 判断 0 是否出现在首位
        else if (nums[0] != 0) {
            return 0;
        }

        // 此时缺失的数字一定在 (0, n) 中
        for(int i=0; i<nums.length-1; i++){
            if(nums[i+1] != nums[i]+1){
                return nums[i]+1;
            }
        }
        return -1;
    }
}

【解题思路2】异或

下标刚好会是 0 到 n-1,设 missing=n
将下标 i 和对应数字 nums[i]异或,最后只有缺失的数字不会被消掉

class Solution {
    public int missingNumber(int[] nums) {
        int missing = nums.length;
        for (int i = 0; i < nums.length; i++) {
            missing ^= i ^ nums[i];
        }
        return missing;
    }
}

【解题思路3】数学

求出 0-n 的和,减去数组中所有数的和,就得到了缺失的数字

class Solution {
    public int missingNumber(int[] nums) {
        int expectedSum = nums.length*(nums.length + 1)/2;
        int actualSum = 0;
        for (int num : nums) actualSum += num;
        return expectedSum - actualSum;
    }
}

你可能感兴趣的:(Leetcode,/,Online,Judge,#,数组,#,重复数)