summaryrefslogtreecommitdiff
path: root/top-interview-questions/easy/array
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2025-02-05 18:36:31 -0800
committer3gg <3gg@shellblade.net>2025-02-05 18:36:31 -0800
commit4689e4e80b479be25f7557d05818f5caa723aafa (patch)
tree4df25811fe2a9a15b401375178da6537f4b6063f /top-interview-questions/easy/array
Initial commit.HEADmain
Diffstat (limited to 'top-interview-questions/easy/array')
-rw-r--r--top-interview-questions/easy/array/01_remove_duplicates_from_sorted_array.cc13
-rw-r--r--top-interview-questions/easy/array/02_best_time_to_buy_and_sell_stock_2.cc24
-rw-r--r--top-interview-questions/easy/array/03_rotate_array.cc39
-rw-r--r--top-interview-questions/easy/array/04_contains_duplicate.cc14
-rw-r--r--top-interview-questions/easy/array/05_single_number.cc10
-rw-r--r--top-interview-questions/easy/array/06_intersection_of_two_arrays_II.cc27
-rw-r--r--top-interview-questions/easy/array/07_plus_one.cc25
-rw-r--r--top-interview-questions/easy/array/08_move_zeroes.cc23
-rw-r--r--top-interview-questions/easy/array/09_two_sum.cc24
9 files changed, 199 insertions, 0 deletions
diff --git a/top-interview-questions/easy/array/01_remove_duplicates_from_sorted_array.cc b/top-interview-questions/easy/array/01_remove_duplicates_from_sorted_array.cc
new file mode 100644
index 0000000..8f5224b
--- /dev/null
+++ b/top-interview-questions/easy/array/01_remove_duplicates_from_sorted_array.cc
@@ -0,0 +1,13 @@
1class Solution {
2public:
3 int removeDuplicates(vector<int>& nums) {
4 size_t i = nums.size() > 0 ? 1 : 0;
5 for (size_t j = 1; j < nums.size(); ++j) {
6 if (nums[j] != nums[i-1]) {
7 nums[i++] = nums[j];
8 }
9 }
10 nums.resize(i);
11 return i;
12 }
13};
diff --git a/top-interview-questions/easy/array/02_best_time_to_buy_and_sell_stock_2.cc b/top-interview-questions/easy/array/02_best_time_to_buy_and_sell_stock_2.cc
new file mode 100644
index 0000000..abc4aa9
--- /dev/null
+++ b/top-interview-questions/easy/array/02_best_time_to_buy_and_sell_stock_2.cc
@@ -0,0 +1,24 @@
1class Solution {
2public:
3 int maxProfit(vector<int>& prices) {
4 int profit = 0;
5 int buy = -1;
6 int sell = -1;
7 for (size_t day = 0; day < prices.size(); ++day) {
8 if ((sell == -1) &&
9 ((buy == -1) || (prices[day] < buy))) {
10 buy = prices[day];
11 } else if ((sell == -1) || (prices[day] > sell)) {
12 sell = prices[day];
13 } else {
14 profit += sell - buy;
15 buy = prices[day];
16 sell = -1;
17 }
18 }
19 if (buy < sell) {
20 profit += sell - buy;
21 }
22 return profit;
23 }
24};
diff --git a/top-interview-questions/easy/array/03_rotate_array.cc b/top-interview-questions/easy/array/03_rotate_array.cc
new file mode 100644
index 0000000..19f66dd
--- /dev/null
+++ b/top-interview-questions/easy/array/03_rotate_array.cc
@@ -0,0 +1,39 @@
1class Solution {
2public:
3 // Works, but it's slow.
4 /*int gcd(int a, int b) {
5 if (a == 0) return b;
6 if (b == 0) return a;
7 if (a == b) return a;
8 if (a > b) return gcd(a-b, b);
9 else return gcd(a, b-a);
10 }*/
11
12 // Much faster than the above implementation.
13 int gcd(int a, int b) {
14 if (b == 0) return a;
15 else return gcd(b, a%b);
16 }
17
18 void rotate(vector<int>& nums, int k) {
19 const size_t N = nums.size();
20 if ((N <= 1) || (k == 0)) {
21 return;
22 }
23 // Original algorithm only works for (N,k) coprime.
24 // Break the cycles when we complete a loop around the array.
25 const int gcdNk = gcd(N,k);
26 const int steps = (gcdNk != 1) ? (N / gcdNk) : N;
27 int start = -1;
28 for (size_t n = 0; n < N; n += steps) {
29 ++start;
30 int i = start;
31 int i_val = nums[i];
32 for (size_t s = 0; s < steps; ++s) {
33 const int next = (i+k) % N;
34 std::swap(i_val, nums[next]);
35 i = next;
36 }
37 }
38 }
39};
diff --git a/top-interview-questions/easy/array/04_contains_duplicate.cc b/top-interview-questions/easy/array/04_contains_duplicate.cc
new file mode 100644
index 0000000..d40d1e4
--- /dev/null
+++ b/top-interview-questions/easy/array/04_contains_duplicate.cc
@@ -0,0 +1,14 @@
1class Solution {
2public:
3 bool containsDuplicate(vector<int>& nums) {
4 std::sort(nums.begin(), nums.end());
5
6 for (size_t i = 1; i < nums.size(); ++i) {
7 if (nums[i-1] == nums[i]) {
8 return true;
9 }
10 }
11
12 return false;
13 }
14};
diff --git a/top-interview-questions/easy/array/05_single_number.cc b/top-interview-questions/easy/array/05_single_number.cc
new file mode 100644
index 0000000..ad55712
--- /dev/null
+++ b/top-interview-questions/easy/array/05_single_number.cc
@@ -0,0 +1,10 @@
1class Solution {
2public:
3 int singleNumber(vector<int>& nums) {
4 int x = 0;
5 for (int n : nums) {
6 x = x ^ n;
7 }
8 return x;
9 }
10};
diff --git a/top-interview-questions/easy/array/06_intersection_of_two_arrays_II.cc b/top-interview-questions/easy/array/06_intersection_of_two_arrays_II.cc
new file mode 100644
index 0000000..0921be8
--- /dev/null
+++ b/top-interview-questions/easy/array/06_intersection_of_two_arrays_II.cc
@@ -0,0 +1,27 @@
1class Solution {
2public:
3 vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
4 std::sort(nums1.begin(), nums1.end());
5 std::sort(nums2.begin(), nums2.end());
6
7 std::vector<int> result;
8 result.reserve(std::max(nums1.size(), nums2.size()));
9
10 size_t i = 0;
11 size_t j = 0;
12
13 while ((i < nums1.size()) && (j < nums2.size())) {
14 if (nums1[i] == nums2[j]) {
15 result.push_back(nums1[i]);
16 ++i;
17 ++j;
18 } else if (nums1[i] < nums2[j]) {
19 ++i;
20 } else {
21 ++j;
22 }
23 }
24
25 return result;
26 }
27};
diff --git a/top-interview-questions/easy/array/07_plus_one.cc b/top-interview-questions/easy/array/07_plus_one.cc
new file mode 100644
index 0000000..05c7b21
--- /dev/null
+++ b/top-interview-questions/easy/array/07_plus_one.cc
@@ -0,0 +1,25 @@
1class Solution {
2public:
3 vector<int> plusOne(vector<int>& digits) {
4 int carry = 1;
5
6 for (int i = digits.size()-1; (i >= 0) && (carry == 1); --i) {
7 const int sum = digits[i] + carry;
8 digits[i] = sum % 10;
9 carry = (sum >= 10) ? 1 : 0;
10 }
11
12 if (carry == 1) { // Overflow.
13 digits.resize(digits.size() + 1);
14
15 // Shift right.
16 for (size_t i = digits.size()-1; i > 0; --i) {
17 digits[i] = digits[i-1];
18 }
19
20 digits[0] = 1;
21 }
22
23 return digits;
24 }
25};
diff --git a/top-interview-questions/easy/array/08_move_zeroes.cc b/top-interview-questions/easy/array/08_move_zeroes.cc
new file mode 100644
index 0000000..074944c
--- /dev/null
+++ b/top-interview-questions/easy/array/08_move_zeroes.cc
@@ -0,0 +1,23 @@
1class Solution {
2public:
3 void moveZeroes(vector<int>& nums) {
4 // Invariant: left subset of array satisfies requirement.
5 bool sorted = false;
6 for (size_t i = 0; (i < nums.size()) && !sorted; ++i) {
7 if (nums[i] == 0) {
8 // Look for j>i with which to swap this 0.
9 // If not found, then we're done.
10 bool found = false;
11 for (size_t j = i+1; j < nums.size(); ++j) {
12 if (nums[j] != 0) {
13 nums[i] = nums[j];
14 nums[j] = 0;
15 found = true;
16 break;
17 }
18 }
19 sorted = !found;
20 }
21 }
22 }
23};
diff --git a/top-interview-questions/easy/array/09_two_sum.cc b/top-interview-questions/easy/array/09_two_sum.cc
new file mode 100644
index 0000000..72d2014
--- /dev/null
+++ b/top-interview-questions/easy/array/09_two_sum.cc
@@ -0,0 +1,24 @@
1class Solution {
2public:
3 vector<int> twoSum(vector<int>& nums, int target) {
4 // When you find, e.g., 2, map (2 -> idx 0) for the event
5 // in which you find the 7.
6 std::vector<int> pair(2);
7 std::unordered_map<int, int> val_to_idx;
8
9 for (size_t i = 0; i < nums.size(); ++i) {
10 const int other = target - nums[i];
11 const auto other_idx = val_to_idx.find(other);
12
13 if (other_idx != val_to_idx.end()) {
14 pair[0] = i;
15 pair[1] = other_idx->second;
16 break;
17 }
18
19 val_to_idx[nums[i]] = i;
20 }
21
22 return pair;
23 }
24};