LeetCode268-缺失数字

题目链接

英文链接:https://leetcode.com/problems/missing-number/

中文链接:https://leetcode-cn.com/problems/missing-number/

题目详述

给定一个包含 0, 1, 2, ..., nn 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

示例 1:

1
2
输入: [3,0,1]
输出: 2

示例 2:

1
2
输入: [9,6,4,2,3,5,7,0,1]
输出: 8

说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?

题目详解

方法一:运用位运算。

1~n 的数字进行异或,将这个结果与数组所有元素进行异或,得到的结果就是缺失的数字。

1
2
3
4
5
6
7
8
9
10
public class LeetCode_00268 {

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

方法二:运用元素和。

运用求和公式减去数组元素和。

1
2
3
4
5
6
7
8
9
10
11
public class LeetCode_00268 {

public int missingNumber(int[] nums) {
int sum = 0;
for (int num : nums) {
sum += num;
}
int n = nums.length;
return n * (n + 1) / 2 - sum;
}
}

直接在遍历的过程中进行计算(防溢出)。

1
2
3
4
5
6
7
8
9
10
public class LeetCode_00268 {

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