From d4013629e7303e30882100a579fcc97be8b40daf Mon Sep 17 00:00:00 2001 From: Ryotaro Kurita Date: Mon, 17 Mar 2025 23:35:35 +0900 Subject: [PATCH] finish --- 283.MoveZeroes/fill_zero.cpp | 17 ++++++++++++ 283.MoveZeroes/memo.md | 50 ++++++++++++++++++++++++++++++++++++ 283.MoveZeroes/remove.cpp | 8 ++++++ 283.MoveZeroes/step1.cpp | 12 +++++++++ 283.MoveZeroes/step2.cpp | 13 ++++++++++ 283.MoveZeroes/step3.cpp | 13 ++++++++++ 6 files changed, 113 insertions(+) create mode 100644 283.MoveZeroes/fill_zero.cpp create mode 100644 283.MoveZeroes/memo.md create mode 100644 283.MoveZeroes/remove.cpp create mode 100644 283.MoveZeroes/step1.cpp create mode 100644 283.MoveZeroes/step2.cpp create mode 100644 283.MoveZeroes/step3.cpp diff --git a/283.MoveZeroes/fill_zero.cpp b/283.MoveZeroes/fill_zero.cpp new file mode 100644 index 0000000..847c14e --- /dev/null +++ b/283.MoveZeroes/fill_zero.cpp @@ -0,0 +1,17 @@ +class Solution { + public: + void moveZeroes(vector& nums) { + int last_zero_index = 0; + for (int i = 0; i < nums.size(); i++) { + if (nums[i] == 0) { + continue; + } + nums[last_zero_index] = nums[i]; + last_zero_index++; + } + + for (int i = last_zero_index; i < nums.size(); i++) { + nums[i] = 0; + } + } + }; diff --git a/283.MoveZeroes/memo.md b/283.MoveZeroes/memo.md new file mode 100644 index 0000000..7c97f67 --- /dev/null +++ b/283.MoveZeroes/memo.md @@ -0,0 +1,50 @@ +## ステップ1 +といたことがあって解法を覚えていた。 +forループのindexでnums全体を探索しながら +non_zero_indexを使って0でない要素を前に詰めていく + +## ステップ2 +fill_zero.cpp +usatieの解法を参考に実装。イテレータは使わない方法 +https://github.com/usatie/leetcode/pull/3/commits/f24aaf1c13c4b2fc1c6d935297d7a318e5b82dda + +remove.cpp +Yoshiki-Iwasaの解法を参考に実装。 +vectorのeraseではなか、のremoveを使う +前者だとforの中で使うのでO(n^2)となるが、後者だと舐めながら0を消して前に詰めるのでO(n) +removeは削除するのではなく、不要な要素を後ろに寄せているだけなので +詰め終わった箇所からnums.end()までゴミデータ?が残っているのは違和感 + +## ステップ3 +**3回書き直しやりましょう、といっているのは、不自然なところや負荷の高いところは覚えられないからです。** + +## 他の方の解法 +・イテレータを使っている + イテレータなんとなく苦手意識がある。使えるメソッドを覚えられていないので馴染みを持てていないからか +・寄せてから0で埋めることもできる。なるほどです。 +・c++のテストの書き方やファイルの分け方勉強になります。 +https://github.com/usatie/leetcode/pull/3/commits/f24aaf1c13c4b2fc1c6d935297d7a318e5b82dda + +・0の場合は削除して配列を前に詰める + この方法もなるほどです。 + 調べたらc++も同じことできそう。 +https://github.com/Yoshiki-Iwasa/Arai60/pull/59 + +・基本の解法は同じか +https://github.com/fhiyo/leetcode/pull/54 + +>zero_indexにしてしまうと、客観的に(or 後から自分で見た場合)自然言語の直感と反するんですね。 +https://github.com/Mike0121/LeetCode/pull/24 + +>「はじめの0が出てくるまでは、i か i + 1 を指していて、0が出てくると、 +>そこで止まり、swap する関係>上、そこから先は常にはじめの0を指している。」 +>くらいじゃないですか?だから、and first_zero < len(nums)がなくても動きますよね。 +https://github.com/fhiyo/leetcode/pull/18#discussion_r1629642641 + +ここの変数名めちゃくちゃ迷いました。 +>zero_indexだとzeroが入っているindexなのかなと思ってしまいます。多分上のコードを見る感じだとnon_zero_lengthぐらいでしょうか +こう見える人もいるのでよく考えてつけないと。zero_indexでいけそうと一瞬思ってします。 +自分はnon_zero_indexにしました。 + +## Discorなど + diff --git a/283.MoveZeroes/remove.cpp b/283.MoveZeroes/remove.cpp new file mode 100644 index 0000000..0339318 --- /dev/null +++ b/283.MoveZeroes/remove.cpp @@ -0,0 +1,8 @@ +class Solution { + public: + void moveZeroes(vector& nums) { + // 0を削除してしまった後の最後のindex + auto end_index = remove(nums.begin(), nums.end(), 0); + fill(end_index, nums.end(), 0); + } + }; diff --git a/283.MoveZeroes/step1.cpp b/283.MoveZeroes/step1.cpp new file mode 100644 index 0000000..229a49c --- /dev/null +++ b/283.MoveZeroes/step1.cpp @@ -0,0 +1,12 @@ +class Solution { + public: + void moveZeroes(vector& nums) { + int non_zero_index = 0; + for (int i = 0; i < nums.size(); i++) { + if (nums[i] != 0) { + swap(nums[non_zero_index], nums[i]); + non_zero_index++; + } + } + } + }; diff --git a/283.MoveZeroes/step2.cpp b/283.MoveZeroes/step2.cpp new file mode 100644 index 0000000..6bd9f86 --- /dev/null +++ b/283.MoveZeroes/step2.cpp @@ -0,0 +1,13 @@ +class Solution { + public: + void moveZeroes(vector& nums) { + int non_zero_index = 0; + for (int i = 0; i < nums.size(); i++) { + if (nums[i] == 0) { + continue; + } + swap(nums[non_zero_index], nums[i]); + non_zero_index++; + } + } + }; diff --git a/283.MoveZeroes/step3.cpp b/283.MoveZeroes/step3.cpp new file mode 100644 index 0000000..6bd9f86 --- /dev/null +++ b/283.MoveZeroes/step3.cpp @@ -0,0 +1,13 @@ +class Solution { + public: + void moveZeroes(vector& nums) { + int non_zero_index = 0; + for (int i = 0; i < nums.size(); i++) { + if (nums[i] == 0) { + continue; + } + swap(nums[non_zero_index], nums[i]); + non_zero_index++; + } + } + };