👋
LeetCode 1768. Merge Strings Alternately - Golangでのstrings.Bufferの利用
1768. Merge Strings Alternately
Difficulty: Easy
https://leetcode.com/studyplan/leetcode-75/ の1問目
str1
とstr2
を交互にマージする。
アプローチ
ruby
- word文字列が長い方のlengthを用いてループ処理をするようにした
-
chars
メソッドは https://zenn.dev/skakimoto/articles/2025-08-08-leetcode-14-longest-common-prefix で過去に利用した
# @param {String} word1
# @param {String} word2
# @return {String}
def merge_alternately(word1, word2)
length = if (word1.length >= word2.length)
word1.length
else
word2.length
end
results = []
length.times do |i|
results << word1.chars[i] || ""
results << word2.chars[i] || ""
end
return results.join("")
end
- リファクタリング
- ifの分岐が不要なのでリファクタリング
- 文字列操作のみのため、charsで配列にする必要がないためそもそも不要。
- 範囲外の値を指定した場合はnilとなる。
> "123"[5]
=> nil
def merge_alternately(word1, word2)
results = []
[word1.length, word2.length].max.times do |i|
results << word1[i]
results << word2[i]
end
return results.join("")
end
python
- 文字列インデックスの値が範囲外を取るとエラーになるため、if文のlengthチェックを追加する。
class Solution:
def mergeAlternately(self, word1: str, word2: str) -> str:
results = []
length = max(len(word1), len(word2))
for i in range(length):
if i < len(word1):
results += word1[i]
if i < len(word2):
results += word2[i]
return "".join(results)
typescript
- プリミティブ型とオブジェクト型の違い
- typescriptではプリミティブ型で型定義する
- 文字列は可変で定義できるので、最初からstring型を利用するように変更
特徴 | プリミティブ型 (string) | オブジェクト型 (String) |
---|---|---|
定義 | 変更不可能な値そのもの。 | 値と、それに関連するメソッドやプロパティの集合体。 |
メモリ | 直接値がスタックに格納される。 | 実際のデータはヒープに格納され、スタックにはそのデータへの参照(ポインタ)が格納される。 |
使用例 | let name: string = "Alice"; | let obj: String = new String("Bob"); |
- プロパティとメソッド
- JavaScript/TypeScriptでは、文字列の長さはlength プロパティで取得する。メソッドのように()をつけて呼び出す必要はない。
function mergeAlternately(word1: string, word2: string): string {
let results: string = "";
const length: number = Math.max(word1.length, word2.length);
for (let i = 0; i < length; i++) {
if (i < word1.length) {
results += word1[i];
}
if (i < word2.length) {
results += word2[i];
}
}
return results
};
golang
- 文字列の結合にはstrings.Builderを使う
func mergeAlternately(word1 string, word2 string) string {
var sb strings.Builder
length := max(len(word1), len(word2))
for i := 0; i < length; i++ {
if i < len(word1) {
sb.WriteByte(word1[i])
}
if i < len(word2) {
sb.WriteByte(word2[i])
}
}
return sb.String()
}
学習のポイント
- 文字列結合のコストについて
- golangでは
+=
で繰り返し文字列を結合すると、新しい文字列が何度も生成されパフォーマンスが悪くなるためstrings.Builder
を利用する
- golangでは
Discussion