题目描述
给定一个包含 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;}