Missing Number

https://leetcode.com/problems/missing-number/
给定一个数组,长度为n,包含0~N的整数,但是缺少一个整数,找出缺少的这个整数(Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?)

题目不是很难,但是几个思路挺有意思

  • 解法1,利用数组本身的性质,既然包含0~N,遍历一遍数组,在保证第i个位置的数字一定是i,然后再遍历一遍,找出缺失的,此处要注意,数组长度为i,但是可能有i+1个整数,举例:input:[2,3,0],缺少的是1,但是nums[3]这个数不存在的
 public int missingNumber(int[] nums) {
        int n = nums.length;

        for (int i = 0; i < n; i++) {
            while ((nums[i] != i) && (nums[i] < n)) {
                swap(nums, nums[i], i);
            }
        }

        for (int i = 0; i < n; i++) {
            if (nums[i] != i) {
                return i;
            }
        }
        return n;
    }

 public void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

解法2:
利用等差数列求和,先求出nums数组内部的所有整数的和sum,然后再用(0+N) * N / 2减去这个sum,多出来的数字就是nums里面缺的数字

解法3:位运算大法

[2,0,3]
(1 xor 2 xor 3) xor (2 xor 0 xor 3) = 1缺的是1

[9,6,4,2,3,5,7,0,1]
(1 xor 2 xor 3 xor 4 xor 5 xor 6 xor 7 xor 8 xor 9) xor (9 xor 6 xor 4 xor 2 xor 3 xor 5 xor 7 xor 0 xor 1) = 8 缺的是8
原理就是 N xor N = 0 , 0 xor N = N

  public int missingNumber2(int[] nums) {
        int res = 0;
        for (int i = 0; i < nums.length; i++) {
            res ^= (i + 1) ^ nums[i];
        }
        return res;
    }

你可能感兴趣的:(Missing Number)