Skip to content

Commit

Permalink
GH-309: Solve leetcode 9 (#310)
Browse files Browse the repository at this point in the history
  • Loading branch information
rain1024 authored May 22, 2023
1 parent 74d0804 commit 7763659
Show file tree
Hide file tree
Showing 17 changed files with 278 additions and 1 deletion.
2 changes: 1 addition & 1 deletion collections/leetcode/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<td>6</td>
<td>7</td>
<td>8</td>
<td>9</td>
<td>🟢&nbsp;<a href='https://github.com/rain1024/datastructures-algorithms-competitive-programming/tree/main/problems/leetcode9'>9</a></td>
<td>10</td>
<tr>
<td>🟡&nbsp;<a href='https://github.com/rain1024/datastructures-algorithms-competitive-programming/tree/main/problems/leetcode11'>11</a></td>
Expand Down
3 changes: 3 additions & 0 deletions collections/leetcode/data.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ problems:
- name: 1
languages: cpp
level: easy
- name: 9
languages: cpp
level: easy
- name: 11
languages: cpp
level: medium
Expand Down
3 changes: 3 additions & 0 deletions problems/leetcode9/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
solution
*.dSYM
python/main/__pycache__
19 changes: 19 additions & 0 deletions problems/leetcode9/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Leetcode Problem

## Usage

Run program with an example

```
bazel run cpp/main:solution < data/1.in
```

Test program

```
# Run all tests
bazel test --test_output=all tests:solution_test
bazel test --test_output=all --cache_test_results=no tests:solution_test
# Run test with pecific test id
bazel test --test_output=all tests:solution_test --test_arg=1
```
7 changes: 7 additions & 0 deletions problems/leetcode9/cpp/main/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
load("@rules_cc//cc:defs.bzl", "cc_binary")

cc_binary(
name = "solution",
srcs = ["solution.cpp", "solution.h", "helpers.h"],
visibility = ["//visibility:public"],
)
59 changes: 59 additions & 0 deletions problems/leetcode9/cpp/main/helpers.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#pragma once

#include <string>
#include <vector>
#include <iostream>
#include <stack>
#include <queue>

using namespace std;

/* Temmplate class T should be a Nary Tree Node
* See leetcode 589 (https://leetcode.com/problems/n-ary-tree-preorder-traversal/description/)
* class Node {
* public:
* int val;
* vector<Node*> children;
*
* Node() {}
*
* Node(int _val) { val = _val; }
*
* Node(int _val, vector<Node*> _children) {
* val = _val;
* children = _children;
* }
* };
*/
template <typename T> T* parse_nary_tree(vector<string> s) {
T* fake = new T();
T* current = fake;
queue<T*> q;
for(string e: s){
if(e == "null"){
current = q.front();
q.pop();
} else {
T* child = new T(stoi(e));
q.push(child);
current->children.push_back(child);
}
}
return fake->children[0];
}

vector<string> parse_line(string line) {
vector<string> v;
string s;
for (char c : line) {
if (c == ' ') {
v.push_back(s);
s = "";
} else {
s += c;
}
}
v.push_back(s);
return v;
}

40 changes: 40 additions & 0 deletions problems/leetcode9/cpp/main/solution.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#include "solution.h"
#include "helpers.h"

#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <fstream>
#include <filesystem>

using namespace std;

int main() {
ios::sync_with_stdio(false);
cin.tie(0);

bool is_use_file = false;

filesystem::path filepath =
filesystem::current_path().parent_path().parent_path() / "data" / "1.in";
ifstream file(filepath);

if (is_use_file) {
cin.rdbuf(file.rdbuf()); // redirect cin to file
}

// get input
int n;
cin >> n;

Solution solution;
bool output = solution.isPalindrome(n);

// print output
cout << output << endl;

return 0;
}
23 changes: 23 additions & 0 deletions problems/leetcode9/cpp/main/solution.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <unordered_map>
#include <vector>
#include <stack>
#include <queue>
#include <climits>

using namespace std;

class Solution {
public:
bool isPalindrome(int x) {
if(x < 0) return false;
string s = to_string(x);
string s1 = to_string(x);
reverse(s1.begin(), s1.end());
return s == s1;
}
};
11 changes: 11 additions & 0 deletions problems/leetcode9/cpp/tests/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_test")

cc_test(
name = "solution_test",
srcs = ["solution_test.cpp"],
deps = [
"//problems/codeforcesAA/src/main:solution",
"@com_google_googletest//:gtest_main",
],
data = ["data"]
)
97 changes: 97 additions & 0 deletions problems/leetcode9/cpp/tests/solution_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#include <cstdlib>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <string>
#include <string_view>
#include <vector>

#include "gtest/gtest.h"

namespace fs = std::filesystem;

using namespace std;

std::string TEST_ID = "";

vector<string> split(string s, string delimiter) {
size_t pos_start = 0, pos_end, delim_len = delimiter.length();
string token;
vector<string> res;

while ((pos_end = s.find(delimiter, pos_start)) != string::npos) {
token = s.substr(pos_start, pos_end - pos_start);
pos_start = pos_end + delim_len;
res.push_back(token);
}

res.push_back(s.substr(pos_start));
return res;
}

std::string GetHello(std::string_view in) {
if (in.size() == 0) {
return std::string("hello, word");
} else {
return std::string("Hello, ") + in.data();
}
}

string ReadFile(const std::string &filename) {
std::ifstream f(filename);
string s((std::istreambuf_iterator<char>(f)),
std::istreambuf_iterator<char>());
return s;
}

vector<string> RunProgram(string fileid) {
vector<string> v;
string program = "problems/codeforcesAA/src/main/solution";
string test_folder = "problems/codeforcesAA/tests/data/";
string command = program + " < " + test_folder + fileid + ".in > output.txt";
std::system(command.c_str());
string actual = ReadFile("output.txt");
string expectedOutputFile = test_folder + fileid + ".out";
string expected = ReadFile(expectedOutputFile);
v.push_back(actual);
v.push_back(expected);
return v;
}

TEST(RunTest, AllTestCases) {
if (TEST_ID != "") {
std::cout << "TEST_ID = " << TEST_ID << std::endl;
} else {
std::cout << "RUN ALL TESTS" << std::endl;
}

std::string test_data_folder = "problems/codeforcesAA/tests/data";
for (const auto &entry : fs::directory_iterator(test_data_folder)) {
string filename = split(entry.path(), "/").back();
vector<string> v = split(filename, ".");
string fileid = v[0];
string extension = v[1];
if (extension != "in"){
continue;
}
if (TEST_ID != ""){
if (fileid != TEST_ID){
continue;
}
}
// Run Test Case
vector<string> output = RunProgram(fileid);
string actual = output[0];
string expected = output[1];
string message = "❌ FAIL CASE: " + fileid;
ASSERT_EQ(actual, expected) << message;
}
}

int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
if (argc == 2) {
TEST_ID = argv[1];
}
return RUN_ALL_TESTS();
}
1 change: 1 addition & 0 deletions problems/leetcode9/data/1.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
121
1 change: 1 addition & 0 deletions problems/leetcode9/data/1.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1
1 change: 1 addition & 0 deletions problems/leetcode9/data/2.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-121
1 change: 1 addition & 0 deletions problems/leetcode9/data/2.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
1 change: 1 addition & 0 deletions problems/leetcode9/data/3.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
10
1 change: 1 addition & 0 deletions problems/leetcode9/data/3.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
9 changes: 9 additions & 0 deletions problems/leetcode9/problem_infos.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "Leetcode 78. Subsets",
"link": "https://leetcode.com/problems/subsets/",
"tags": [
"Array",
"Backtracking",
"Bit Manipulation"
]
}

0 comments on commit 7763659

Please sign in to comment.