👋

LeetCode 1768. Merge Strings Alternately - Golangでのstrings.Bufferの利用

に公開

1768. Merge Strings Alternately

Difficulty: Easy
https://leetcode.com/problems/merge-strings-alternately/

https://leetcode.com/studyplan/leetcode-75/ の1問目

str1str2を交互にマージする。

アプローチ

ruby

# @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

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を利用する

Discussion