From f24aaf1c13c4b2fc1c6d935297d7a318e5b82dda Mon Sep 17 00:00:00 2001 From: Shun Usami Date: Thu, 30 Jan 2025 11:58:15 -0800 Subject: [PATCH 1/4] Solved 283. Move Zeroes --- Arai60/44. Move Zeroes/main.cpp | 27 ++++++++++++++ Arai60/44. Move Zeroes/step1.cpp | 22 ++++++++++++ Arai60/44. Move Zeroes/step2.cpp | 62 ++++++++++++++++++++++++++++++++ Arai60/44. Move Zeroes/step3.cpp | 18 ++++++++++ 4 files changed, 129 insertions(+) create mode 100644 Arai60/44. Move Zeroes/step1.cpp create mode 100644 Arai60/44. Move Zeroes/step2.cpp create mode 100644 Arai60/44. Move Zeroes/step3.cpp diff --git a/Arai60/44. Move Zeroes/main.cpp b/Arai60/44. Move Zeroes/main.cpp index e69de29..b3ab96a 100644 --- a/Arai60/44. Move Zeroes/main.cpp +++ b/Arai60/44. Move Zeroes/main.cpp @@ -0,0 +1,27 @@ +#include "step3.cpp" +#include +#include +#include +#include + +void test(std::initializer_list input, + std::initializer_list expected) { + std::vector nums(input); + std::vector expected_nums(expected); + std::cout << "input: "; + for (auto num : nums) { + std::cout << num << " "; + } + Solution().moveZeroes(nums); + // vectorに== operatorが使えるって知らなかった + // https://en.cppreference.com/w/cpp/container/vector/operator_cmp + assert(nums == expected_nums); + std::cout << " ===== OK =====" << std::endl; +} + +int main() { + test({0, 1, 0, 3, 12}, {1, 3, 12, 0, 0}); + test({0}, {0}); + test({0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}); + test({1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}); +} diff --git a/Arai60/44. Move Zeroes/step1.cpp b/Arai60/44. Move Zeroes/step1.cpp new file mode 100644 index 0000000..1a8c0e3 --- /dev/null +++ b/Arai60/44. Move Zeroes/step1.cpp @@ -0,0 +1,22 @@ +/* + 何がわからなかったか + - N/A + 何を考えて解いていたか + 1. In place -> swapを使いたい + 2. Use two pointers, one for next insert position, the other for cursor + 3. When it == next_it, swap is not necessary but it's okay + 正解してから気づいたこと + - N/A +*/ +class Solution { +public: + void moveZeroes(vector &nums) { + auto next_it = nums.begin(); + for (auto it = nums.begin(); it < nums.end(); ++it) { + if (*it != 0) { + std::iter_swap(next_it, it); + ++next_it; + } + } + } +}; diff --git a/Arai60/44. Move Zeroes/step2.cpp b/Arai60/44. Move Zeroes/step2.cpp new file mode 100644 index 0000000..057df06 --- /dev/null +++ b/Arai60/44. Move Zeroes/step2.cpp @@ -0,0 +1,62 @@ +/* + 講師陣はどのようなコメントを残すだろうか? + - + 他の人のコードを読んで考えたこと + - https://github.com/Yoshiki-Iwasa/Arai60/pull/59/files + 1. retainした後にresizeで0埋めするというのはコードとして見通しが良い + 2. &mut nums[1..]という書き方は、コピーにならないのか + ならないみたい + https://doc.rust-lang.org/book/ch04-03-slices.html + - https://github.com/fhiyo/leetcode/pull/54/files + 1. swapするのではなく, あとでまとめて0埋めする方がloop unrollingが効いて + 嬉しいこともあるというのはなるほど目から鱗だった + 改善する時にかんがえたこと + 1. `std::swap(*next_pos++, num)`とか`*next_pos++ = + num`という書き方もできるけど, error-proneなのでやめた + 2. Iteratorを使わない場合はswapしたいので、numがreferenceとなるよう注意 + 3. 0埋めをあとで行うのは, + filterしたい値が1つだけの場合に有効だが、複数の値をたとえば移動したい場合とかは順番もretainできるしswapがよいかな + */ + +class Solution { +public: + // 1. swapを使う + void moveZeroes1(vector &nums) { + auto next_pos = nums.begin(); + for (auto &num : nums) { + if (num != 0) { + std::swap(*next_pos, num); + ++next_pos; + } + } + } + // 1-2. swapを使う (with Iterator) + void moveZeroes12(vector &nums) { + auto next_pos = nums.begin(); + for (auto it = nums.begin(); it != nums.end(); ++it) { + if (*it != 0) { + std::iter_swap(*next_pos, it); + ++next_pos; + } + } + } + // 2. swapを使わないで, 0埋めを後で行う + void moveZeroes2(vector &nums) { + auto next_pos = nums.begin(); + for (auto &num : nums) { + if (num != 0) { + *next_pos = num; + ++next_pos; + } + } + std::fill(next_pos, nums.end(), 0); + } + // 2-2. for/if文をOne-linerっぽく書く (error-proneなので好きではない) + void moveZeroes22(vector &nums) { + auto next_pos = nums.begin(); + for (auto num : nums) + if (num != 0) + *next_pos++ = num; + std::fill(next_pos, nums.end(), 0); + } +}; diff --git a/Arai60/44. Move Zeroes/step3.cpp b/Arai60/44. Move Zeroes/step3.cpp new file mode 100644 index 0000000..9a7a7ca --- /dev/null +++ b/Arai60/44. Move Zeroes/step3.cpp @@ -0,0 +1,18 @@ +#include +/* + 3問連続で正解するのにかかった時間 2:57 + 時間計算量: O(N) + 空間計算量: O(1) +*/ +class Solution { +public: + void moveZeroes(std::vector &nums) { + auto next = nums.begin(); + for (auto it = nums.begin(); it != nums.end(); ++it) { + if (*it != 0) { + std::iter_swap(it, next); + ++next; + } + } + } +}; From 89cb1887136ff07f94e19e311183070e3691fbe1 Mon Sep 17 00:00:00 2001 From: Shun Usami Date: Fri, 31 Jan 2025 14:29:26 -0800 Subject: [PATCH 2/4] Modify files for each step to be header files in Arai60/44. Move Zeroes --- Arai60/44. Move Zeroes/main.cpp | 3 +-- Arai60/44. Move Zeroes/{step1.cpp => step1.hpp} | 7 +++++++ Arai60/44. Move Zeroes/{step2.cpp => step2.hpp} | 9 +++++++++ Arai60/44. Move Zeroes/{step3.cpp => step3.hpp} | 8 ++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) rename Arai60/44. Move Zeroes/{step1.cpp => step1.hpp} (82%) rename Arai60/44. Move Zeroes/{step2.cpp => step2.hpp} (94%) rename Arai60/44. Move Zeroes/{step3.cpp => step3.hpp} (78%) diff --git a/Arai60/44. Move Zeroes/main.cpp b/Arai60/44. Move Zeroes/main.cpp index b3ab96a..dd571b1 100644 --- a/Arai60/44. Move Zeroes/main.cpp +++ b/Arai60/44. Move Zeroes/main.cpp @@ -1,5 +1,4 @@ -#include "step3.cpp" -#include +#include "step3.hpp" #include #include #include diff --git a/Arai60/44. Move Zeroes/step1.cpp b/Arai60/44. Move Zeroes/step1.hpp similarity index 82% rename from Arai60/44. Move Zeroes/step1.cpp rename to Arai60/44. Move Zeroes/step1.hpp index 1a8c0e3..26b30b9 100644 --- a/Arai60/44. Move Zeroes/step1.cpp +++ b/Arai60/44. Move Zeroes/step1.hpp @@ -8,6 +8,12 @@ 正解してから気づいたこと - N/A */ +#ifndef STEP1_HPP +#define STEP1_HPP +#include +#include +using std::iter_swap; +using std::vector; class Solution { public: void moveZeroes(vector &nums) { @@ -20,3 +26,4 @@ class Solution { } } }; +#endif diff --git a/Arai60/44. Move Zeroes/step2.cpp b/Arai60/44. Move Zeroes/step2.hpp similarity index 94% rename from Arai60/44. Move Zeroes/step2.cpp rename to Arai60/44. Move Zeroes/step2.hpp index 057df06..5922abf 100644 --- a/Arai60/44. Move Zeroes/step2.cpp +++ b/Arai60/44. Move Zeroes/step2.hpp @@ -18,6 +18,14 @@ filterしたい値が1つだけの場合に有効だが、複数の値をたとえば移動したい場合とかは順番もretainできるしswapがよいかな */ +#ifndef STEP2_HPP +#define STEP2_HPP + +#include +#include +using std::iter_swap; +using std::vector; + class Solution { public: // 1. swapを使う @@ -60,3 +68,4 @@ class Solution { std::fill(next_pos, nums.end(), 0); } }; +#endif diff --git a/Arai60/44. Move Zeroes/step3.cpp b/Arai60/44. Move Zeroes/step3.hpp similarity index 78% rename from Arai60/44. Move Zeroes/step3.cpp rename to Arai60/44. Move Zeroes/step3.hpp index 9a7a7ca..3d8a48c 100644 --- a/Arai60/44. Move Zeroes/step3.cpp +++ b/Arai60/44. Move Zeroes/step3.hpp @@ -1,4 +1,11 @@ +#ifndef STEP3_HPP +#define STEP3_HPP + +#include #include +using std::iter_swap; +using std::vector; + /* 3問連続で正解するのにかかった時間 2:57 時間計算量: O(N) @@ -16,3 +23,4 @@ class Solution { } } }; +#endif From 0023c08c6412a1416bacfff88c61b74027248b27 Mon Sep 17 00:00:00 2001 From: Shun Usami Date: Fri, 31 Jan 2025 14:32:27 -0800 Subject: [PATCH 3/4] Add Makefile for Arai60/44. Move Zeroes --- Arai60/44. Move Zeroes/Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Arai60/44. Move Zeroes/Makefile diff --git a/Arai60/44. Move Zeroes/Makefile b/Arai60/44. Move Zeroes/Makefile new file mode 100644 index 0000000..4ec71d4 --- /dev/null +++ b/Arai60/44. Move Zeroes/Makefile @@ -0,0 +1,9 @@ +NAME = a.out +SRC = main.cpp +CXX = g++ +CXXFLAGS = -Wall -Wextra -Werror -std=c++11 + +all: $(NAME) + +$(NAME): $(SRC) step3.hpp + $(CXX) -o $(NAME) $(SRC) $(CXXFLAGS) From 449870284e037eb8047c65452a165070e7579776 Mon Sep 17 00:00:00 2001 From: Shun Usami Date: Sat, 1 Feb 2025 20:26:30 -0800 Subject: [PATCH 4/4] [283/move-zeroes] Remove using declaration in header files https://en.cppreference.com/w/cpp/language/using_declaration --- Arai60/44. Move Zeroes/step1.hpp | 4 +--- Arai60/44. Move Zeroes/step2.hpp | 4 +--- Arai60/44. Move Zeroes/step3.hpp | 2 -- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/Arai60/44. Move Zeroes/step1.hpp b/Arai60/44. Move Zeroes/step1.hpp index 26b30b9..013847c 100644 --- a/Arai60/44. Move Zeroes/step1.hpp +++ b/Arai60/44. Move Zeroes/step1.hpp @@ -12,11 +12,9 @@ #define STEP1_HPP #include #include -using std::iter_swap; -using std::vector; class Solution { public: - void moveZeroes(vector &nums) { + void moveZeroes(std::vector &nums) { auto next_it = nums.begin(); for (auto it = nums.begin(); it < nums.end(); ++it) { if (*it != 0) { diff --git a/Arai60/44. Move Zeroes/step2.hpp b/Arai60/44. Move Zeroes/step2.hpp index 5922abf..9b4d019 100644 --- a/Arai60/44. Move Zeroes/step2.hpp +++ b/Arai60/44. Move Zeroes/step2.hpp @@ -23,13 +23,11 @@ #include #include -using std::iter_swap; -using std::vector; class Solution { public: // 1. swapを使う - void moveZeroes1(vector &nums) { + void moveZeroes1(std::vector &nums) { auto next_pos = nums.begin(); for (auto &num : nums) { if (num != 0) { diff --git a/Arai60/44. Move Zeroes/step3.hpp b/Arai60/44. Move Zeroes/step3.hpp index 3d8a48c..4cfedb6 100644 --- a/Arai60/44. Move Zeroes/step3.hpp +++ b/Arai60/44. Move Zeroes/step3.hpp @@ -3,8 +3,6 @@ #include #include -using std::iter_swap; -using std::vector; /* 3問連続で正解するのにかかった時間 2:57