Missing Number

2019-09-29  本文已影响0人  瞬铭

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?)

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

 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;
    }
上一篇 下一篇

猜你喜欢

热点阅读