【LeetCode】Jianzhi Offer <2回目のスワイプ>(2)

目次

お題:差し出す剣 04. 二次元配列検索 - LeetCode

トピックのインターフェース:

問題解決のアイデア:

コード:

終わりました!

タイトル: 差し出す剣 05. スペースを置換する - LeetCode

トピックのインターフェース:

問題解決のアイデア:

コード:

終わりました!

最後に次のように書きます。


お題:差し出す剣 04. 二次元配列検索 - LeetCode

トピックのインターフェース:

func findNumberIn2DArray(matrix [][]int, target int) bool {

}

問題解決のアイデア:

この質問が現れるとすぐに、暴力的なプレイヤーとして、すべての値を直接列挙してそれを見つけるという暴力的な解決策を考えることができますが、この質問は非常に古典的であるため、直接考えることができます彼の最適化されたソリューションについて。

どうやって考えたかというと、たくさん質問をしていれば自然と思いつくもので、比較的簡単で、質問の性質に応じて右上から探したり、左下から探したりすることができます。ここでは右上隅を選択し、現在位置がターゲットより小さい場合は検索し現在位置がターゲットより大きい場合は下に検索して、O(N) アルゴリズムに最適化します。

コード:

func findNumberIn2DArray(matrix [][]int, target int) bool {
    i, j := len(matrix) - 1, 0
    for i >= 0 && j < len(matrix[0]) {
        if target < matrix[i][j] {
            i--
        } else if target > matrix[i][j] {
            j++
        } else {
            return true
        }
    }
    return false
}

終わりました!

タイトル:差し出す剣 05. スペースを置換する - LeetCode

トピックのインターフェース:

func replaceSpace(s string) string {

}

問題解決のアイデア:

この質問を読んだ後、解決策が 2 つ思いつきます。1 つは、スペースを %20 に直接置き換える方法です。この方法では、時間計算量が非常に高く、効率が非常に低く、明らかに適切ではありません。 2回目の最適化時間を考える方法、

2 番目の方法は、別の文字列を作成し、古い文字列を新しい文字列に追加し、スペースが見つかった場合は %20 を追加することです。これも考えるのが最も簡単な最適化方法ですが、スペースの複雑さが消費されます。コード:

func replaceSpace(s string) string {
    var arr string
    for _, c := range s {
        if c == ' ' {
            arr += "%20"
        } else {
            arr += string(c)
        }
    }
    return arr 
}

もっと良いアルゴリズムはあるのでしょうか?実際にはあります. ここでは、コードが記録されて LeetCode の問題解決領域に送信されるという解決策を参照します. これはダブル ポインター ソリューションを使用します. 具体的な操作は次のとおりです: 1) 元の配列をトラバースし、元の配列を展開します必要なスペースに応じて定量的に配列を作成します。2) 後ろから前に移動すると、1 つのポインタは元の配列の末尾を指し、もう 1 つは新しい末尾を指し、スペースが見つかると %20 が追加されます。

コード:

func replaceSpace(s string) string {
    // 遍历原数组,并定量扩容
    b := []byte(s)
    length := len(b)
    spaceCount := 0
    for _, v := range b {
        if v == ' ' {
            spaceCount++
        }
    }
    reSize := spaceCount * 2
    tmp := make([]byte, reSize)
    b = append(b, tmp...)
   
    // 根据要求追加内容
    i := length - 1
    j := len(b) - 1
    for i >= 0 {
        if b[i] != ' ' {
            b[j] = b[i]
            i--
            j--
        } else {
            b[j] = '0'
            b[j - 1] = '2'
            b[j - 2] = '%'
            i--
            j -= 3
        }
    }
    return string(b)
}

終わりました!

最後に次のように書きます。

以上が今回の記事の内容となります、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/132581570