Skip to content

Commit 8841d69

Browse files
authored
GH-169: Solve leetcode 129 (#183)
1 parent 6627aff commit 8841d69

File tree

14 files changed

+277
-1
lines changed

14 files changed

+277
-1
lines changed

collections/leetcode/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@
149149
<td>126</td>
150150
<td>127</td>
151151
<td>128</td>
152-
<td>129</td>
152+
<td>🟡&nbsp;<a href='https://github.com/rain1024/datastructures-algorithms-competitive-programming/tree/main/problems/leetcode129'>129</a></td>
153153
<td>130</td>
154154
<tr>
155155
<td>131</td>

collections/leetcode/data.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ problems:
1717
- name: 101
1818
languages: cpp
1919
level: easy
20+
- name: 129
21+
languages: cpp
22+
level: medium
2023
- name: 142
2124
languages: cpp
2225
level: medium

problems/leetcode129/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
solution
2+
*.dSYM

problems/leetcode129/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Leetcode Problem
2+
3+
## Usage
4+
5+
Run program with an example
6+
7+
```
8+
bazel run cpp/main:solution < data/1.in
9+
```
10+
11+
Test program
12+
13+
```
14+
# Run all tests
15+
bazel test --test_output=all tests:solution_test
16+
bazel test --test_output=all --cache_test_results=no tests:solution_test
17+
# Run test with pecific test id
18+
bazel test --test_output=all tests:solution_test --test_arg=1
19+
```

problems/leetcode129/cpp/main/BUILD

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
load("@rules_cc//cc:defs.bzl", "cc_binary")
2+
3+
cc_binary(
4+
name = "solution",
5+
srcs = ["solution.cpp", "solution.h"],
6+
visibility = ["//visibility:public"],
7+
)
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
#include "solution.h"
2+
3+
#include <algorithm>
4+
#include <cmath>
5+
#include <fstream>
6+
#include <iostream>
7+
#include <map>
8+
#include <string>
9+
#include <vector>
10+
11+
using namespace std;
12+
13+
TreeNode* parse_tree(string s) {
14+
// parse tree from string with format
15+
// 1 2 3 4 5 6 null 7
16+
string value = "";
17+
vector<TreeNode*> nodes;
18+
TreeNode* node;
19+
for (int i = 0; i < s.size(); i++) {
20+
if (s[i] == ' ') {
21+
if (value == "null") {
22+
node = nullptr;
23+
} else {
24+
node = new TreeNode(stoi(value));
25+
}
26+
value = "";
27+
nodes.push_back(node);
28+
} else {
29+
value += s[i];
30+
}
31+
}
32+
if (value == "null") {
33+
node = nullptr;
34+
} else {
35+
node = new TreeNode(stoi(value));
36+
}
37+
nodes.push_back(node);
38+
int n = nodes.size();
39+
queue<TreeNode*> q;
40+
TreeNode* head = nodes[0];
41+
q.push(head);
42+
int i = 1;
43+
while (!q.empty() && i < n) {
44+
node = q.front();
45+
q.pop();
46+
node->left = nodes[i];
47+
node->right = nodes[i + 1];
48+
q.push(nodes[i]);
49+
q.push(nodes[i + 1]);
50+
i += 2;
51+
}
52+
return head;
53+
}
54+
55+
int main() {
56+
ios::sync_with_stdio(false);
57+
cin.tie(0);
58+
59+
bool is_use_file = false;
60+
61+
filesystem::path filepath =
62+
filesystem::current_path().parent_path().parent_path() / "data" / "1.in";
63+
ifstream file(filepath);
64+
65+
if (is_use_file) {
66+
cin.rdbuf(file.rdbuf()); // redirect cin to file
67+
}
68+
69+
// get input
70+
string s;
71+
getline(cin, s);
72+
TreeNode* root = parse_tree(s);
73+
74+
Solution solution;
75+
int output = solution.sumNumbers(root);
76+
77+
// print output
78+
cout << output << endl;
79+
80+
return 0;
81+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include <algorithm>
2+
#include <cmath>
3+
#include <map>
4+
#include <queue>
5+
#include <set>
6+
#include <stack>
7+
#include <string>
8+
#include <unordered_map>
9+
#include <vector>
10+
11+
using namespace std;
12+
13+
// Definition for a binary tree node.
14+
struct TreeNode {
15+
int val;
16+
TreeNode *left;
17+
TreeNode *right;
18+
TreeNode() : val(0), left(nullptr), right(nullptr) {}
19+
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
20+
TreeNode(int x, TreeNode *left, TreeNode *right)
21+
: val(x), left(left), right(right) {}
22+
};
23+
24+
class Solution {
25+
public:
26+
int bfs(TreeNode *node) {
27+
if (node == nullptr) {
28+
return 0;
29+
}
30+
if (!node->left && !node->right) {
31+
return node->val;
32+
}
33+
if (node->left) {
34+
node->left->val = node->val * 10 + node->left->val;
35+
}
36+
if (node->right) {
37+
node->right->val = node->val * 10 + node->right->val;
38+
}
39+
return bfs(node->left) + bfs(node->right);
40+
}
41+
42+
int sumNumbers(TreeNode *root) { return bfs(root); }
43+
};

problems/leetcode129/cpp/tests/BUILD

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_test")
2+
3+
cc_test(
4+
name = "solution_test",
5+
srcs = ["solution_test.cpp"],
6+
deps = [
7+
"//problems/codeforcesAA/src/main:solution",
8+
"@com_google_googletest//:gtest_main",
9+
],
10+
data = ["data"]
11+
)
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#include <cstdlib>
2+
#include <filesystem>
3+
#include <fstream>
4+
#include <iostream>
5+
#include <string>
6+
#include <string_view>
7+
#include <vector>
8+
9+
#include "gtest/gtest.h"
10+
11+
namespace fs = std::filesystem;
12+
13+
using namespace std;
14+
15+
std::string TEST_ID = "";
16+
17+
vector<string> split(string s, string delimiter) {
18+
size_t pos_start = 0, pos_end, delim_len = delimiter.length();
19+
string token;
20+
vector<string> res;
21+
22+
while ((pos_end = s.find(delimiter, pos_start)) != string::npos) {
23+
token = s.substr(pos_start, pos_end - pos_start);
24+
pos_start = pos_end + delim_len;
25+
res.push_back(token);
26+
}
27+
28+
res.push_back(s.substr(pos_start));
29+
return res;
30+
}
31+
32+
std::string GetHello(std::string_view in) {
33+
if (in.size() == 0) {
34+
return std::string("hello, word");
35+
} else {
36+
return std::string("Hello, ") + in.data();
37+
}
38+
}
39+
40+
string ReadFile(const std::string &filename) {
41+
std::ifstream f(filename);
42+
string s((std::istreambuf_iterator<char>(f)),
43+
std::istreambuf_iterator<char>());
44+
return s;
45+
}
46+
47+
vector<string> RunProgram(string fileid) {
48+
vector<string> v;
49+
string program = "problems/codeforcesAA/src/main/solution";
50+
string test_folder = "problems/codeforcesAA/tests/data/";
51+
string command = program + " < " + test_folder + fileid + ".in > output.txt";
52+
std::system(command.c_str());
53+
string actual = ReadFile("output.txt");
54+
string expectedOutputFile = test_folder + fileid + ".out";
55+
string expected = ReadFile(expectedOutputFile);
56+
v.push_back(actual);
57+
v.push_back(expected);
58+
return v;
59+
}
60+
61+
TEST(RunTest, AllTestCases) {
62+
if (TEST_ID != "") {
63+
std::cout << "TEST_ID = " << TEST_ID << std::endl;
64+
} else {
65+
std::cout << "RUN ALL TESTS" << std::endl;
66+
}
67+
68+
std::string test_data_folder = "problems/codeforcesAA/tests/data";
69+
for (const auto &entry : fs::directory_iterator(test_data_folder)) {
70+
string filename = split(entry.path(), "/").back();
71+
vector<string> v = split(filename, ".");
72+
string fileid = v[0];
73+
string extension = v[1];
74+
if (extension != "in"){
75+
continue;
76+
}
77+
if (TEST_ID != ""){
78+
if (fileid != TEST_ID){
79+
continue;
80+
}
81+
}
82+
// Run Test Case
83+
vector<string> output = RunProgram(fileid);
84+
string actual = output[0];
85+
string expected = output[1];
86+
string message = "❌ FAIL CASE: " + fileid;
87+
ASSERT_EQ(actual, expected) << message;
88+
}
89+
}
90+
91+
int main(int argc, char **argv) {
92+
::testing::InitGoogleTest(&argc, argv);
93+
if (argc == 2) {
94+
TEST_ID = argv[1];
95+
}
96+
return RUN_ALL_TESTS();
97+
}

problems/leetcode129/data/1.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1 2 3

problems/leetcode129/data/1.out

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
25

problems/leetcode129/data/2.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
4 9 0 5 1

problems/leetcode129/data/2.out

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1026
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "Leetcode 78. Subsets",
3+
"link": "https://leetcode.com/problems/subsets/",
4+
"tags": [
5+
"Array",
6+
"Backtracking",
7+
"Bit Manipulation"
8+
]
9+
}

0 commit comments

Comments
 (0)