diff --git a/task_01/src/main.cpp b/task_01/src/main.cpp index 0e4393ba..e62d14ca 100644 --- a/task_01/src/main.cpp +++ b/task_01/src/main.cpp @@ -1,3 +1,17 @@ #include +#include +#include -int main() { return 0; } +#include "searching_sum.hpp" + +int main() { + int n, k; + std::cin >> n >> k; + std::vector vec(n); + for (int i = 0; i < n; i++) { + std::cin >> vec[i]; + } + std::pair ans = SearchingSum(vec, k); + std::cout << ans.first << " " << ans.second << std::endl; + return 0; +} diff --git a/task_01/src/searching_sum.cpp b/task_01/src/searching_sum.cpp new file mode 100644 index 00000000..666700c8 --- /dev/null +++ b/task_01/src/searching_sum.cpp @@ -0,0 +1,17 @@ +#include "searching_sum.hpp" + +#include + +std::pair SearchingSum(std::vector vec, int num) { + int start = 0; + int end = vec.size() - 1; + while (start < end) { + if (vec[start] + vec[end] > num) + --end; + else if (vec[start] + vec[end] < num) + ++start; + else + return std::make_pair(start, end); + } + return std::make_pair(-1, -1); +} \ No newline at end of file diff --git a/task_01/src/searching_sum.hpp b/task_01/src/searching_sum.hpp new file mode 100644 index 00000000..139727d5 --- /dev/null +++ b/task_01/src/searching_sum.hpp @@ -0,0 +1,9 @@ +#ifndef SEARCHING_SUM_HPP +#define SEARCHING_SUM_HPP + +#include +#include + +std::pair SearchingSum(std::vector vec, int num); + +#endif // define Searching_sum.hpp \ No newline at end of file diff --git a/task_01/src/test.cpp b/task_01/src/test.cpp index ef5a86ae..eb03eaeb 100644 --- a/task_01/src/test.cpp +++ b/task_01/src/test.cpp @@ -1,8 +1,48 @@ - #include -#include "topology_sort.hpp" +#include +#include + +#include "searching_sum.hpp" TEST(TopologySort, Simple) { - ASSERT_EQ(1, 1); // Stack [] + int sum1 = 6; + std::vector vec1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + std::pair ans1{0, 6}; + ASSERT_EQ(SearchingSum(vec1, sum1), ans1); + + int sum2 = 6; + std::vector vec2{0}; + std::pair ans2{-1, -1}; + ASSERT_EQ(SearchingSum(vec2, sum2), ans2); + + int sum3 = 4; + std::vector vec3{-11, -6, 0, 1, 2, 4, 10, 16}; + std::pair ans3{1, 6}; + ASSERT_EQ(SearchingSum(vec3, sum3), ans3); + + int sum4 = 0; + std::vector vec4{-17, -8, -1, 1, 2, 4, 10}; + std::pair ans4{2, 3}; + ASSERT_EQ(SearchingSum(vec4, sum4), ans4); + + int sum5 = -9; + std::vector vec5{-17, -8, -1, 1, 2, 4, 10}; + std::pair ans5{1, 2}; + ASSERT_EQ(SearchingSum(vec5, sum5), ans5); + + int sum6 = 17; + std::vector vec6{-17, -8, -1, 1, 2, 4, 10}; + std::pair ans6{-1, -1}; + ASSERT_EQ(SearchingSum(vec6, sum6), ans6); + + int sum7 = -1; + std::vector vec7{-18, -10, -1, -1, -1, 0, 3, 5, 10}; + std::pair ans7{2, 5}; + ASSERT_EQ(SearchingSum(vec7, sum7), ans7); + + int sum8 = 5; + std::vector vec8(0); + std::pair ans8{-1, -1}; + ASSERT_EQ(SearchingSum(vec8, sum8), ans8); } diff --git a/task_01/src/topology_sort.cpp b/task_01/src/topology_sort.cpp deleted file mode 100644 index e53f670c..00000000 --- a/task_01/src/topology_sort.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "topology_sort.hpp" diff --git a/task_01/src/topology_sort.hpp b/task_01/src/topology_sort.hpp deleted file mode 100644 index 6f70f09b..00000000 --- a/task_01/src/topology_sort.hpp +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/task_02/src/main.cpp b/task_02/src/main.cpp index 0e4393ba..7fbe48d8 100644 --- a/task_02/src/main.cpp +++ b/task_02/src/main.cpp @@ -1,3 +1,3 @@ -#include +#include "stack.hpp" -int main() { return 0; } +int main() { Stack stack; } diff --git a/task_02/src/stack.cpp b/task_02/src/stack.cpp deleted file mode 100644 index 8ca89902..00000000 --- a/task_02/src/stack.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "stack.hpp" - -#include - -void Stack::Push(int value) { data_.push(value); } - -int Stack::Pop() { - auto result = data_.top(); - data_.pop(); - return result; -} - -void MinStack::Push(int value) { data_.push_back(value); } - -int MinStack::Pop() { - auto result = data_.back(); - data_.pop_back(); - return result; -} - -int MinStack::GetMin() { return *std::min_element(data_.begin(), data_.end()); } \ No newline at end of file diff --git a/task_02/src/stack.hpp b/task_02/src/stack.hpp index 138ec40f..ae1df3c0 100644 --- a/task_02/src/stack.hpp +++ b/task_02/src/stack.hpp @@ -1,23 +1,107 @@ #pragma once -#include -#include +#include +template +struct Element { + explicit Element(T data, std::shared_ptr> prev = nullptr) + : element{data}, prev{prev} {} + + explicit Element() : element{}, prev{nullptr} {} + + T element; + + std::shared_ptr> prev; +}; + +template class Stack { public: - void Push(int value); - int Pop(); + explicit Stack() : data_{} {} + + void Push(T value); + + T Pop(); + + bool Empty() const; + + const T& Top() const; + + size_t Size() const; private: - std::stack data_; + Element data_; + + size_t size_ = 0; }; +template +void Stack::Push(T value) { + Element new_data{value, std::make_shared>(data_)}; + size_ += 1; + data_ = new_data; +} + +template +T Stack::Pop() { + T deleted_element = data_.element; + Element new_data = *data_.prev; + data_.prev = nullptr; + data_ = new_data; + size_ -= 1; + return deleted_element; +} + +template +bool Stack::Empty() const { + return data_.prev == nullptr; +} + +template +const T& Stack::Top() const { + return data_.element; +} + +template +size_t Stack::Size() const { + return size_; +} + +template class MinStack { public: - void Push(int value); - int Pop(); - int GetMin(); + void Push(T value); + T Pop(); + T GetMin() const; private: - std::vector data_; + Stack main_stack_; + Stack min_stack_; }; + +template +void MinStack::Push(T value) { + if (main_stack_.Size() == 0) { + min_stack_.Push(value); + main_stack_.Push(value); + } else { + main_stack_.Push(value); + if (value < min_stack_.Top()) + min_stack_.Push(value); + else + min_stack_.Push(min_stack_.Top()); + } +} + +template +T MinStack::Pop() { + T result = main_stack_.Top(); + main_stack_.Pop(); + min_stack_.Pop(); + return result; +} + +template +T MinStack::GetMin() const { + return min_stack_.Top(); +} \ No newline at end of file diff --git a/task_02/src/test.cpp b/task_02/src/test.cpp index 54e7ce90..eebfa1e4 100644 --- a/task_02/src/test.cpp +++ b/task_02/src/test.cpp @@ -1,12 +1,9 @@ - #include -#include - #include "stack.hpp" TEST(StackTest, Simple) { - Stack stack; + Stack stack; stack.Push(1); // Stack [1] ASSERT_EQ(stack.Pop(), 1); // Stack [] stack.Push(1); // Stack [1] @@ -22,7 +19,7 @@ TEST(StackTest, Simple) { } TEST(MinStackTest, Simple) { - MinStack stack; + MinStack stack; stack.Push(1); // Stack [1] ASSERT_EQ(stack.GetMin(), 1); ASSERT_EQ(stack.Pop(), 1); // Stack [] @@ -39,4 +36,16 @@ TEST(MinStackTest, Simple) { ASSERT_EQ(stack.GetMin(), 1); ASSERT_EQ(stack.Pop(), 3); // Stack [1] ASSERT_EQ(stack.Pop(), 1); // Stack [] + stack.Push(2); // Stack [2] + ASSERT_EQ(stack.GetMin(), 2); + stack.Push(7); // Stack [2, 7] + ASSERT_EQ(stack.GetMin(), 2); + stack.Push(-2); // Stack [2, 7, -2] + ASSERT_EQ(stack.GetMin(), -2); + stack.Push(8); // Stack [2, 7, -2, 8] + ASSERT_EQ(stack.GetMin(), -2); + stack.Push(-2); // Stack [2, 7, -2, 8, -2] + ASSERT_EQ(stack.GetMin(), -2); + ASSERT_EQ(stack.Pop(), -2); // Stack [2, 7, -2, 8] + ASSERT_EQ(stack.GetMin(), -2); } \ No newline at end of file diff --git a/task_03/src/main.cpp b/task_03/src/main.cpp index 0e4393ba..a46533a9 100644 --- a/task_03/src/main.cpp +++ b/task_03/src/main.cpp @@ -1,3 +1,3 @@ -#include +#include "temperature.hpp" int main() { return 0; } diff --git a/task_03/src/temperature.cpp b/task_03/src/temperature.cpp new file mode 100644 index 00000000..d78b7011 --- /dev/null +++ b/task_03/src/temperature.cpp @@ -0,0 +1,19 @@ +#include "temperature.hpp" + +#include +#include + +std::vector days_before_warming(std::vector daily_temp) { + std::vector days_amount(daily_temp.size()); + std::stack previous_days; + for (int day_index = 0; day_index < daily_temp.size(); ++day_index) { + days_amount[day_index] = 0; + while (!previous_days.empty() && + daily_temp[previous_days.top()] <= daily_temp[day_index]) { + days_amount[previous_days.top()] = day_index - previous_days.top(); + previous_days.pop(); + } + previous_days.push(day_index); + } + return days_amount; +} \ No newline at end of file diff --git a/task_03/src/temperature.hpp b/task_03/src/temperature.hpp new file mode 100644 index 00000000..c0e2c0a5 --- /dev/null +++ b/task_03/src/temperature.hpp @@ -0,0 +1,3 @@ +#include + +std::vector days_before_warming(std::vector daily_temp); \ No newline at end of file diff --git a/task_03/src/test.cpp b/task_03/src/test.cpp index ef5a86ae..24dfa245 100644 --- a/task_03/src/test.cpp +++ b/task_03/src/test.cpp @@ -1,8 +1,33 @@ - #include -#include "topology_sort.hpp" +#include + +#include "temperature.hpp" + +TEST(temperature, Simple) { + std::vector daily_temp_1 = days_before_warming({1, 2, 3, 4, 5}); + std::vector result_1 = {1, 1, 1, 1, 0}; + ASSERT_EQ(daily_temp_1, result_1); + + std::vector daily_temp_2 = days_before_warming({0}); + std::vector result_2 = {0}; + ASSERT_EQ(daily_temp_2, result_2); + + std::vector daily_temp_3 = days_before_warming({}); + std::vector result_3 = {}; + ASSERT_EQ(daily_temp_3, result_3); + + std::vector daily_temp_4 = + days_before_warming({1, 2, -4, -5, -6, -8, 9}); + std::vector result_4 = {1, 5, 4, 3, 2, 1, 0}; + ASSERT_EQ(daily_temp_4, result_4); + + std::vector daily_temp_5 = days_before_warming({1, 2, 1, 2, 1, 2, 1, 2}); + std::vector result_5 = {1, 2, 1, 2, 1, 2, 1, 0}; + ASSERT_EQ(daily_temp_5, result_5); -TEST(TopologySort, Simple) { - ASSERT_EQ(1, 1); // Stack [] -} + std::vector daily_temp_6 = + days_before_warming({2, 1, 3, 1, 4, 1, 3, 1, 2, 1, 5}); + std::vector result_6 = {2, 1, 2, 1, 6, 1, 4, 1, 2, 1, 0}; + ASSERT_EQ(daily_temp_6, result_6); +} \ No newline at end of file diff --git a/task_03/src/topology_sort.cpp b/task_03/src/topology_sort.cpp deleted file mode 100644 index e53f670c..00000000 --- a/task_03/src/topology_sort.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "topology_sort.hpp" diff --git a/task_03/src/topology_sort.hpp b/task_03/src/topology_sort.hpp deleted file mode 100644 index 6f70f09b..00000000 --- a/task_03/src/topology_sort.hpp +++ /dev/null @@ -1 +0,0 @@ -#pragma once