-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmissing_number.cpp
More file actions
135 lines (124 loc) · 3.14 KB
/
missing_number.cpp
File metadata and controls
135 lines (124 loc) · 3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
* =====================================================================================
*
* Filename: missing_number.cpp
*
* Description: Missing number. Given an array containing n distinct numbers taken
* from 0, 1, 2, ..., n, find the one that is missing from the array.
*
* Version: 1.0
* Created: 03/05/19 01:43:59
* Revision: none
* Compiler: gcc
*
* Author: Zhu Xianfeng (), xianfeng.zhu@gmail.com
* Organization:
*
* =====================================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include "gmock/gmock.h"
#include "gtest/gtest.h"
// Sort algorithm, std::sort
class Solution1 {
public:
int missingNumber(std::vector<int>& nums) { return sortMissing(nums); }
private:
int sortMissing(std::vector<int>& nums) {
std::sort(nums.begin(), nums.end());
int supposed = 0;
for (size_t i = 0; i < nums.size(); i++) {
if (nums[i] != supposed) {
// Find missing
break;
}
supposed++;
}
return supposed;
}
};
// Sort algorithm, quick sort
class Solution2 {
public:
int missingNumber(std::vector<int>& nums) { return sortMissing(nums); }
private:
int sortMissing(std::vector<int>& nums) {
quickSort(nums, 0, nums.size() - 1);
int supposed = 0;
for (size_t i = 0; i < nums.size(); i++) {
if (nums[i] != supposed) {
// Find missing
break;
}
supposed++;
}
return supposed;
}
void quickSort(std::vector<int>& nums, int left, int right) {
if (left < right) {
int middle = partition(nums, left, right);
quickSort(nums, left, middle - 1);
quickSort(nums, middle + 1, right);
}
}
int partition(std::vector<int>& nums, int left, int right) {
int midval = nums[right];
int last = left;
for (int i = left; i < right; i++) {
if (nums[i] >= midval) {
continue;
}
if (last != i) {
swap(&nums[last], &nums[i]);
}
last++;
}
if (last != right) {
swap(&nums[last], &nums[right]);
}
return last;
}
void swap(int* a, int* b) {
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
};
// Bit manipulation trick, xor
class Solution3 {
public:
int missingNumber(std::vector<int>& nums) {
int supposed = 0;
for (size_t i = 0; i < nums.size(); i++) {
supposed ^= i;
supposed ^= nums[i];
}
supposed ^= nums.size();
return supposed;
}
};
// Gauss formula
class Solution4 {
public:
int missingNumber(std::vector<int>& nums) {
int sum = nums.size() * (nums.size() + 1) / 2;
for (const auto val : nums) {
sum -= val;
}
return sum;
}
};
TEST(Solution, missingNumber) {
std::vector<std::pair<std::vector<int>, int>> cases{
std::make_pair(std::vector<int>{3, 0, 1}, 2),
};
for (auto& c : cases) {
EXPECT_EQ(Solution1().missingNumber(c.first), c.second);
EXPECT_EQ(Solution2().missingNumber(c.first), c.second);
EXPECT_EQ(Solution3().missingNumber(c.first), c.second);
EXPECT_EQ(Solution4().missingNumber(c.first), c.second);
}
}