Skip to content

Commit 43f6de8

Browse files
committed
feat: add solutions to lcci problem: No.17.04
No.17.04.Missing Number
1 parent e7d01dc commit 43f6de8

File tree

10 files changed

+366
-72
lines changed

10 files changed

+366
-72
lines changed

lcci/17.04.Missing Number/README.md

+180-31
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,25 @@
2626

2727
<!-- 这里可写通用的实现逻辑 -->
2828

29-
1. 排序
30-
- 排序 `nums`,检查 `nums[i] == i`,返回条件不成立的 `i`
31-
- 若全部符合条件,则返回 `nums.length`
32-
2. 数学
33-
- 遍历 `nums`,统计总和,并记录其中的最大值。
34-
- 若最大值与 `nums.length` 一致,使用高斯算法(`(n + 1) * n / 2`)计算总和,与遍历总和相减,得到结果。
35-
- 不一致,则缺失的就是 `nums.length`
36-
3. 位运算
37-
- 利用异或的特性,`res = res ^ x ^ x`。对同一个值异或两次,结果等于它本身。最后异或的结果,就是只出现一次的数字,即数组中缺失的整数。
29+
**方法一:排序**
30+
31+
我们可以先对数组 $nums$ 进行排序,然后遍历排序后的数组,判断当前元素是否等于其下标,若不等,则返回下标即可。
32+
33+
否则遍历结束后,返回数组长度即可。
34+
35+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组 $nums$ 的长度。
36+
37+
**方法二:求和**
38+
39+
我们可以先求出 $0$ 到 $n$ 的和,然后遍历数组 $nums$,将数组中的元素依次减去,最后剩下的值即为缺失的数字。
40+
41+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 $nums$ 的长度。
42+
43+
**方法三:位运算**
44+
45+
我们可以使用异或运算,将 $0$ 到 $n$ 的所有数与数组 $nums$ 中的数进行异或运算,最后剩下的值即为缺失的数字。
46+
47+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 $nums$ 的长度。
3848

3949
<!-- tabs:start -->
4050

@@ -45,10 +55,26 @@
4555
```python
4656
class Solution:
4757
def missingNumber(self, nums: List[int]) -> int:
48-
res = 0
49-
for i, num in enumerate(nums):
50-
res = res ^ num ^ (i + 1)
51-
return res
58+
nums.sort()
59+
for i, x in enumerate(nums):
60+
if i != x:
61+
return i
62+
return len(nums)
63+
```
64+
65+
```python
66+
class Solution:
67+
def missingNumber(self, nums: List[int]) -> int:
68+
return sum(range(len(nums) + 1)) - sum(nums)
69+
```
70+
71+
```python
72+
class Solution:
73+
def missingNumber(self, nums: List[int]) -> int:
74+
ans = 0
75+
for i, x in enumerate(nums, 1):
76+
ans ^= i ^ x
77+
return ans
5278
```
5379

5480
### **Java**
@@ -58,12 +84,118 @@ class Solution:
5884
```java
5985
class Solution {
6086
public int missingNumber(int[] nums) {
61-
int res = 0;
62-
for (int i = 0; i < nums.length; ++i) {
63-
res = res ^ nums[i] ^ (i + 1);
87+
Arrays.sort(nums);
88+
int n = nums.length;
89+
for (int i = 0; i < n; ++i) {
90+
if (i != nums[i]) {
91+
return i;
92+
}
93+
}
94+
return n;
95+
}
96+
}
97+
```
98+
99+
```java
100+
class Solution {
101+
public int missingNumber(int[] nums) {
102+
int n = nums.length;
103+
int ans = n;
104+
for (int i = 0; i < n; ++i) {
105+
ans += i - nums[i];
106+
}
107+
return ans;
108+
}
109+
}
110+
```
111+
112+
```java
113+
class Solution {
114+
public int missingNumber(int[] nums) {
115+
int ans = 0;
116+
for (int i = 1; i <= nums.length; ++i) {
117+
ans ^= i ^ nums[i - 1];
118+
}
119+
return ans;
120+
}
121+
}
122+
```
123+
124+
### **C++**
125+
126+
```cpp
127+
class Solution {
128+
public:
129+
int missingNumber(vector<int>& nums) {
130+
sort(nums.begin(), nums.end());
131+
int n = nums.size();
132+
for (int i = 0; i < n; ++i) {
133+
if (i != nums[i]) {
134+
return i;
135+
}
64136
}
65-
return res;
137+
return n;
66138
}
139+
};
140+
```
141+
142+
```cpp
143+
class Solution {
144+
public:
145+
int missingNumber(vector<int>& nums) {
146+
int n = nums.size();
147+
int ans = n;
148+
for (int i = 0; i < n; ++i) {
149+
ans += i - nums[i];
150+
}
151+
return ans;
152+
}
153+
};
154+
```
155+
156+
```cpp
157+
class Solution {
158+
public:
159+
int missingNumber(vector<int>& nums) {
160+
int ans = 0;
161+
for (int i = 1; i <= nums.size(); ++i) {
162+
ans ^= i ^ nums[i - 1];
163+
}
164+
return ans;
165+
}
166+
};
167+
```
168+
169+
### **Go**
170+
171+
```go
172+
func missingNumber(nums []int) int {
173+
sort.Ints(nums)
174+
for i, x := range nums {
175+
if i != x {
176+
return i
177+
}
178+
}
179+
return len(nums)
180+
}
181+
```
182+
183+
```go
184+
func missingNumber(nums []int) (ans int) {
185+
ans = len(nums)
186+
for i, x := range nums {
187+
ans += i - x
188+
}
189+
return
190+
}
191+
```
192+
193+
```go
194+
func missingNumber(nums []int) (ans int) {
195+
for i, x := range nums {
196+
ans ^= (i + 1) ^ x
197+
}
198+
return
67199
}
68200
```
69201

@@ -75,26 +207,43 @@ class Solution {
75207
* @return {number}
76208
*/
77209
var missingNumber = function (nums) {
78-
let res;
79-
for (let i = 0; i < nums.length; i++) {
80-
res = res ^ nums[i] ^ (i + 1);
210+
nums.sort((a, b) => a - b);
211+
const n = nums.length;
212+
for (let i = 0; i < n; ++i) {
213+
if (i != nums[i]) {
214+
return i;
215+
}
81216
}
82-
return res;
217+
return n;
83218
};
84219
```
85220

86-
### **C++**
221+
```js
222+
/**
223+
* @param {number[]} nums
224+
* @return {number}
225+
*/
226+
var missingNumber = function (nums) {
227+
const n = nums.length;
228+
let ans = n;
229+
for (let i = 0; i < n; ++i) {
230+
ans += i - nums[i];
231+
}
232+
return ans;
233+
};
234+
```
87235

88-
```cpp
89-
class Solution {
90-
public:
91-
int missingNumber(vector<int>& nums) {
92-
int res = 0;
93-
for (int i = 0; i < nums.size(); ++i) {
94-
res = res ^ nums[i] ^ (i + 1);
95-
}
96-
return res;
236+
```js
237+
/**
238+
* @param {number[]} nums
239+
* @return {number}
240+
*/
241+
var missingNumber = function (nums) {
242+
let ans = 0;
243+
for (let i = 1; i <= nums.length; ++i) {
244+
ans ^= i ^ nums[i - 1];
97245
}
246+
return ans;
98247
};
99248
```
100249

0 commit comments

Comments
 (0)