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