From 5c65e1c14f7f149116e45ed7eebd00df457818f6 Mon Sep 17 00:00:00 2001 From: Ryotaro Kurita Date: Sun, 30 Mar 2025 16:02:58 +0900 Subject: [PATCH 1/3] finish --- 6.ZigzagConversion/memo.md | 90 ++++++++++++++++++++++++++++++++++ 6.ZigzagConversion/step1.cpp | 45 +++++++++++++++++ 6.ZigzagConversion/step2.cpp | 47 ++++++++++++++++++ 6.ZigzagConversion/step2_1.cpp | 35 +++++++++++++ 6.ZigzagConversion/step2_2.cpp | 30 ++++++++++++ 6.ZigzagConversion/step3.cpp | 34 +++++++++++++ 6 files changed, 281 insertions(+) create mode 100644 6.ZigzagConversion/memo.md create mode 100644 6.ZigzagConversion/step1.cpp create mode 100644 6.ZigzagConversion/step2.cpp create mode 100644 6.ZigzagConversion/step2_1.cpp create mode 100644 6.ZigzagConversion/step2_2.cpp create mode 100644 6.ZigzagConversion/step3.cpp diff --git a/6.ZigzagConversion/memo.md b/6.ZigzagConversion/memo.md new file mode 100644 index 0000000..52474b8 --- /dev/null +++ b/6.ZigzagConversion/memo.md @@ -0,0 +1,90 @@ +## ステップ1 +手作業でするならどうするのか考えてみる +まずnumRows行の方眼紙を用意する。列数はわからないので予め用意しておくか、必要になれば広げる +sから一文字ずつ転記する +・まずは行の1番下まで埋まるように +・次は一文字ずつ行の1番上まで辿り着くように + この時は一文字転記したら次の列に移動 +1番上までたどり着いたらまた行の1番下まで埋まるように文字を転記する +上の作業が終わったら今度は列、行という順で文字を拾って組み合わせる + +1人1転記で作業をさせるなら、下記の情報が必要かな。 +・下向きに作業をしているのか上むきに作業すしているのかのフラグ +・前の作業者はどこに転記したのか + +1 5 9 +2468 +3 7 +3にたどり着いたら、次は上むきと伝える。 +5に辿り着いたら、次は下向きと伝える。 + +numRowsをm、stringの長さをnとすると +時間計算量と空間計算量どちらもO(m n) + +## ステップ2 +step2.cppでは下記について対応。 +・条件分岐が多いので読み辛い +・vector>で必要以上の領域を確保していないか + +・条件分岐が多いので読み辛い + 転換する処理を、上方向と下方向に動く処理の中から外だし。 + 移動処理が重複していたので切り離し + +・vector>で必要以上の領域を確保していないか + colはs.size()で領域を確保している + =>leetcodeの解説にミニマムで確保する方法の説明があった。 + 上から下まで下がって、また上まで上がる部分を一つのセクションを捉えると + 上から下方向にはnumRows文字 + 下から上方向には、numRows - 2文字必要で、1セクションに対してnumRows + (numRows - 2)文字必要 + 必要なセクション数は、s.size() / (2numRows - 2) + 各セクションは、numRows - 1列必要なのでs.size() / (2numRows - 2) * (numRows - 1)が最小で必要な数 + +step2_1.cpp +step2.cppのvector>からvectorへ + Yoshiki-Iwasaさんの回答を参照 + 何度か調べた気がするが効率のいいstringの繋げ方を調べてみる + + stringstreamは前に一度使った気がするけど、効率的でないのか。 + >Is std::stringstream any better for this purpose? + >No, iostreams are notoriously slow (in spite of theoretical possible high speed): + >you can be reasonably sure that it will be slower than most any alternative, due to flawed locale support. + https://www.reddit.com/r/cpp_questions/comments/wxiyg1/most_efficient_way_to_concatenate_strings/ + + こちらの中でも色々議論されている + reserveを使って予め必要なメモリを確保しておけば先確保を減らすことができる。 + https://stackoverflow.com/questions/611263/efficient-string-concatenation-in-c + +step2_2.cpp +step2_1.cppで使っていたbool is_downforwardをint directionに置き換え +fhiyoの回答を参考 +個人的には、boolで管理した方が理解しやすいと感じた。 +row += directionまでいかないとdirectionがどう動作するのか理解できないからか + +## ステップ3 +**3回書き直しやりましょう、といっているのは、不自然なところや負荷の高いところは覚えられないからです。** +step2_1.cppを用いる + +## 他の方の解法 +・確かに、領域確保にいきなり数式が出てくると何をしているのか理解できないので + コメントで補足があった方が良さそう +・テーブル全部埋める必要はなくて、行ごとに文字列を入れる + なるほどです。空間計算量を抑えられますね。 +https://github.com/Yoshiki-Iwasa/Arai60/pull/65/commits/fba81a9cffadbaf178b3f63871ab2ea644ec790d + +>文字列を走査しながら各文字に行番号(ArrayListのindex番号)を振る +>`s = "PAYPALISHIRING"`, `numRows = 3` であれば `01210121012101` +こういう法則に気づけるようになりたい。ここからだとvectorでの解法を導き出せそう。 + +・1行でのifや三項演算子を自分は使わないので読むのに少し苦労した。 + +>Google Style Guide は条件が1行、中身が1行のときだけぶら下がりを許容としています。 +>時々、編集を重ねているうちに事故を起こすんですよ。 + こんな視点もあるんですね。 +https://github.com/Hurukawa2121/leetcode/pull/5#discussion_r1874549052 +https://github.com/katsukii/leetcode/pull/7/commits/53f8587b823e99f591e551ecdfc3315d97b203db + +上方向とした方向の処理をboolで管理していたけど、int directionで表す方法がある +これを使ってrowの更新を行う +https://github.com/fhiyo/leetcode/pull/58/commits/8689c74cda55693bdaaeca6721e9c80c9aaacf02#diff-9924eba75ce80cfb26b487ccdaaf7bae5d8affe8661b63382ef4051a602e81f6 +## Discorなど + diff --git a/6.ZigzagConversion/step1.cpp b/6.ZigzagConversion/step1.cpp new file mode 100644 index 0000000..7d0d1b6 --- /dev/null +++ b/6.ZigzagConversion/step1.cpp @@ -0,0 +1,45 @@ +class Solution { + public: + string convert(string s, int numRows) { + if (numRows == 1) { + return s; + } + vector> transcription(numRows, vector(s.size(), ' ')); + + bool is_downforward = true; + int row = 0; + int col = 0; + for (int i = 0; i < s.size(); i++) { + transcription[row][col] = s[i]; + + if (is_downforward) { + if (row == numRows - 1) { + is_downforward = false; + row--; + col++; + } else { + row++; + } + } else { + if (row == 0) { + is_downforward = true; + row++; + } else { + row--; + col++; + } + } + } + + string converted = ""; + for (int row = 0; row < transcription.size(); row++) { + for (int col = 0; col < transcription[0].size(); col++) { + if (transcription[row][col] == ' ') { + continue; + } + converted.push_back(transcription[row][col]); + } + } + return converted; + } + }; diff --git a/6.ZigzagConversion/step2.cpp b/6.ZigzagConversion/step2.cpp new file mode 100644 index 0000000..ad3bd96 --- /dev/null +++ b/6.ZigzagConversion/step2.cpp @@ -0,0 +1,47 @@ +class Solution { + public: + string convert(string s, int numRows) { + if (numRows == 1) { + return s; + } + // 文字が上から下に配置され、次に斜めに配置される部分を1セクションとする + // 上から下へはnumRows文字必要で下から上へ斜めにnumRows-2文字必要 + // 1セクションには合計numRows + (numRows - 2)文字が必要。 + // 必要なセクション数は、文字列の長さs.size()を(2*numRows - 2)で割った値。 + // 各セクションは、numRows - 1列が必要。 + int num_cols = ceil(s.size() / (2 * numRows - 2.0)) * (numRows - 1); + vector> transcription(numRows, vector(num_cols, ' ')); + + bool is_downforward = true; + int row = 0; + int col = 0; + for (int i = 0; i < s.size(); i++) { + transcription[row][col] = s[i]; + + if (is_downforward) { + row++; + } else { + row--; + col++; + } + + if (row == numRows - 1) { + is_downforward = false; + } + if (row == 0) { + is_downforward = true; + } + } + + string converted = ""; + for (int row = 0; row < transcription.size(); row++) { + for (int col = 0; col < transcription[0].size(); col++) { + if (transcription[row][col] == ' ') { + continue; + } + converted.push_back(transcription[row][col]); + } + } + return converted; + } + }; diff --git a/6.ZigzagConversion/step2_1.cpp b/6.ZigzagConversion/step2_1.cpp new file mode 100644 index 0000000..354fa08 --- /dev/null +++ b/6.ZigzagConversion/step2_1.cpp @@ -0,0 +1,35 @@ +class Solution { + public: + string convert(string s, int numRows) { + if (numRows == 1) { + return s; + } + vector string_per_row(numRows); + + bool is_downforward = true; + int row = 0; + for (char letter : s) { + string_per_row[row] += letter; + + if (is_downforward) { + row++; + } else { + row--; + } + + if (row == numRows - 1) { + is_downforward = false; + } + if (row == 0) { + is_downforward = true; + } + } + + string converted = ""; + converted.reserve(s.size()); + for (const auto& str : string_per_row) { + converted += str; + } + return converted; + } + }; diff --git a/6.ZigzagConversion/step2_2.cpp b/6.ZigzagConversion/step2_2.cpp new file mode 100644 index 0000000..2a6f6e8 --- /dev/null +++ b/6.ZigzagConversion/step2_2.cpp @@ -0,0 +1,30 @@ +class Solution { + public: + string convert(string s, int numRows) { + if (numRows == 1) { + return s; + } + vector string_per_row(numRows); + + int direction = -1; + int row = 0; + for (char letter : s) { + string_per_row[row] += letter; + + if (row == numRows - 1) { + direction = -1; + } + if (row == 0) { + direction = 1; + } + row += direction; + } + + string converted = ""; + converted.reserve(s.size()); + for (const auto& str : string_per_row) { + converted += str; + } + return converted; + } + }; diff --git a/6.ZigzagConversion/step3.cpp b/6.ZigzagConversion/step3.cpp new file mode 100644 index 0000000..56de49d --- /dev/null +++ b/6.ZigzagConversion/step3.cpp @@ -0,0 +1,34 @@ +class Solution { + public: + string convert(string s, int numRows) { + if (numRows == 1) { + return s; + } + vector string_per_row(numRows); + + bool is_downforward = true; + int row = 0; + for (char letter : s) { + string_per_row[row] += letter; + if (is_downforward) { + row++; + } else { + row--; + } + + if (row == numRows - 1) { + is_downforward = false; + } + if (row == 0) { + is_downforward = true; + } + } + + string converted = ""; + converted.reserve(s.size()); + for (const auto& str : string_per_row) { + converted += str; + } + return converted; + } + }; From 06372716cb48402f683f9614d1bf4706d16ac741 Mon Sep 17 00:00:00 2001 From: Ryotaro Kurita Date: Sun, 6 Apr 2025 11:44:29 +0900 Subject: [PATCH 2/3] add step4 --- 6.ZigzagConversion/memo.md | 6 ++++++ 6.ZigzagConversion/step4.cpp | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 6.ZigzagConversion/step4.cpp diff --git a/6.ZigzagConversion/memo.md b/6.ZigzagConversion/memo.md index 52474b8..96d0370 100644 --- a/6.ZigzagConversion/memo.md +++ b/6.ZigzagConversion/memo.md @@ -54,6 +54,12 @@ step2.cppのvector>からvectorへ reserveを使って予め必要なメモリを確保しておけば先確保を減らすことができる。 https://stackoverflow.com/questions/611263/efficient-string-concatenation-in-c + 今回stringの最長は1000文字。numRowsが1000の場合、一文字ずつ繋げる必要がある。 + 下記の記事によると、環境にもよるがだいたい初期は32文字まで確保されている。 + https://stackoverflow.com/questions/53216377/how-much-memory-is-allocated-to-an-uninitialized-stdstring-variable + 1000 / 32 ≒ 31なので、31回リアロケーションが発生する。 + あらかじめreserveで確保しておくと、1度ですむ。 + step2_2.cpp step2_1.cppで使っていたbool is_downforwardをint directionに置き換え fhiyoの回答を参考 diff --git a/6.ZigzagConversion/step4.cpp b/6.ZigzagConversion/step4.cpp new file mode 100644 index 0000000..8d6bd9b --- /dev/null +++ b/6.ZigzagConversion/step4.cpp @@ -0,0 +1,28 @@ +class Solution { + public: + string convert(string s, int numRows) { + if (numRows == 1) { + return s; + } + vector string_per_row(numRows); + + bool is_downforward = true; + int row = 0; + for (char letter : s) { + string_per_row[row] += letter; + if (is_downforward) { + row++; + } else { + row--; + } + + if (row == numRows - 1) { + is_downforward = false; + } else if (row == 0) { + is_downforward = true; + } + } + + return reduce(string_per_row.begin(), string_per_row.end()); + } + }; From 5c0fe4fe30015bcd2bdce00ce1f7607b7a04ec1e Mon Sep 17 00:00:00 2001 From: Ryotaro Kurita Date: Tue, 8 Apr 2025 22:00:54 +0900 Subject: [PATCH 3/3] add investigation --- 6.ZigzagConversion/main | Bin 0 -> 46208 bytes 6.ZigzagConversion/main.cpp | 64 ++++++++++++++++++++++++++++++++++++ 6.ZigzagConversion/memo.md | 24 +++++++++++++- 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100755 6.ZigzagConversion/main create mode 100644 6.ZigzagConversion/main.cpp diff --git a/6.ZigzagConversion/main b/6.ZigzagConversion/main new file mode 100755 index 0000000000000000000000000000000000000000..d6d2159746e402547cd4e0d8fb846e57f872275c GIT binary patch literal 46208 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 literal 0 HcmV?d00001 diff --git a/6.ZigzagConversion/main.cpp b/6.ZigzagConversion/main.cpp new file mode 100644 index 0000000..0350001 --- /dev/null +++ b/6.ZigzagConversion/main.cpp @@ -0,0 +1,64 @@ +#include +#include +#include +#include + +using namespace std; + +class Solution { + public: + string convert(string s, int numRows) { + if (numRows == 1) { + return s; + } + vector string_per_row(numRows); + + bool is_downforward = true; + int row = 0; + for (char letter : s) { + string_per_row[row] += letter; + if (is_downforward) { + row++; + } else { + row--; + } + + if (row == numRows - 1) { + is_downforward = false; + } else if (row == 0) { + is_downforward = true; + } + } + + string converted = ""; + converted.reserve(s.size()); + for (const auto& str : string_per_row) { + converted += str; + // std::cout << converted.size() << "/" << converted.capacity() << std::endl; + } + return converted; + } + }; + + int main() { + Solution sol; + string input = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk"; + int numRows = 3; + + // 計測開始 + auto start = std::chrono::high_resolution_clock::now(); + string result = sol.convert(input, numRows); + //std::cout << "変換後の文字列: " << result << std::endl; + + // 計測終了 + auto end = std::chrono::high_resolution_clock::now(); + + // 経過時間(ミリ秒) + //std::chrono::duration elapsed = end - start; + // std::cout << "処理時間: " << elapsed.count() << " 秒" << std::endl; + // 経過時間(マイクロ秒) + auto elapsed_us = std::chrono::duration_cast(end - start).count(); + std::cout << "処理時間: " << elapsed_us << " マイクロ秒" << std::endl; + + return 0; + } \ No newline at end of file diff --git a/6.ZigzagConversion/memo.md b/6.ZigzagConversion/memo.md index 96d0370..8f433f1 100644 --- a/6.ZigzagConversion/memo.md +++ b/6.ZigzagConversion/memo.md @@ -57,9 +57,31 @@ step2.cppのvector>からvectorへ 今回stringの最長は1000文字。numRowsが1000の場合、一文字ずつ繋げる必要がある。 下記の記事によると、環境にもよるがだいたい初期は32文字まで確保されている。 https://stackoverflow.com/questions/53216377/how-much-memory-is-allocated-to-an-uninitialized-stdstring-variable - 1000 / 32 ≒ 31なので、31回リアロケーションが発生する。 + ~~1000 / 32 ≒ 31なので、31回リアロケーションが発生する。~~ + →これは誤り。領域は確保のたびに倍のサイズになるので、6回発生 あらかじめreserveで確保しておくと、1度ですむ。 + Mac OS上でテスト + sは1000文字にしてリアロケーションがどのように発生するのか確認 + capcityの変化 : 22 47 95 191 383 767 1535 + + #include を用いて実行速度を計測する。 + https://www.rk-k.com/archives/6973 + ・sは1000文字、numRows = 1000 + reserve無し + 処理時間: 0.000161757 秒 + reserveあり + 処理時間: 0.000206844 秒 + + ・sは1000文字、numRows = 1000 + reserve無し + 処理時間: 3.6マイクロ 秒 + reserveあり + 処理時間: 3.6マイクロ 秒 + + reserveを使うことで、リアロケーションは発生しなくなったが + 1000文字では、実行速度に差が見られなかった。 + step2_2.cpp step2_1.cppで使っていたbool is_downforwardをint directionに置き換え fhiyoの回答を参考