缺失数字

题目描述

给定一个包含 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,遍历数组,缺失的即为答案

/**
 * 使用额外数组
 * 空间复杂度O(n)
 * 时间复杂度O(n)
 * @param nums
 * @return
 */
public int missingNumber(int[] nums) {
        int []arr = new int[nums.length +1];
        for(int num:nums) {
        	arr[num] = num;
        }
        for(int i=0;i<arr.length;i++) {
        	if(arr[i] == 0) {
        		return i;
        	}
        }
        return 0;
    }

思路2:原数组排序,对空间进行优化

/**
	 * 思路2:数组排序
	 * 找到缺失的那个数字
	 * 空间复杂度O(n)
	 * 时间复杂度O(1)
	 * @param nums
	 * @return
	 */
	public int missingNumber(int[] nums) {
        int temp=0;
		for(int i=0;i<nums.length;i++) {
        	if(nums[i] != i && nums[i] != nums.length) {
        		temp = nums[nums[i]];
        		nums[nums[i]] = nums[i];
        		nums[i] = temp;
        		i--;
        	}
        }
		for(int i=0;i<nums.length;i++) {
			if(nums[i]!=i) {
				return i;
			}
		}
		return nums.length;
    }

思路2:位运算
利用异或(不同为1,相同为0)特性:
0^4=4
4^4=0
4^ 0 ^4=0

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

猜你喜欢

转载自blog.csdn.net/zhaohong_bo/article/details/88957005