0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LeetCode解説 No.6 Zigzag Convention [Go]

Last updated at Posted at 2024-11-15

問題:https://leetcode.com/problems/zigzag-conversion/description/?envType=study-plan-v2&envId=top-interview-150

この問題では、文字列をジグザグの形に並べて、その結果を読み取るということを求めています。

問題の流れ
1,ジグザグパターンを作る
与えられた文字列を指定された行数でジグザグ状に並べる。

2,ジグザグの並びを読み取る
ジグザグパターンを行ごとに読み取り、1つの文字列として結合する。

具体例
入力:
PAYPALISHIRING (文字列)
numRows = 3 (行数)

まず、この文字列を3行のジグザグパターンで配置します。

最初の文字 P を1行目に置きます。
次の文字 A を2行目に。
次の文字 Y を3行目に。
その次の文字 P を再び2行目に戻ります。
さらに次の文字 A を1行目に戻ります。
こうして「ジグザグの順序」で配置されます。

P   A   H   N
A P L S I I G
Y   I   R

文字の並び方として,
1, 上から下へ移動(各行に文字を順番に置く)。
2, 一番下の行に到達したら、上へ戻る。
3, 一番上の行に到達したら、再び下に移動する。

となっています.

それではGolangで実装してみます.

package main

func convert(s string, numRows int) string {
	if numRows == 1 {
		return s
	}

	rows := make([]string, min(numRows, len(s)))
	curRow := 0
	goingDown := false

	for _, c := range s {
		rows[curRow] += string(c)
		// 一番上か一番下の行に到達したら方向を変える
		if curRow == 0 || curRow == numRows-1 {
			goingDown = !goingDown
		}
		// 一行進む
		if goingDown {
			curRow++
		} else {
			curRow--
		}
	}
	result := ""
	for _, row := range rows {
		result += row
	}
	return result
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

コードの詳細解説
なぜ min(numRows, len(s)) なのか?
A. numRows が len(s) より大きい場合の最適化
例えば、文字列 s = "ABC" で numRows = 5 の場合を考えてみます。この場合:

実際に必要な行数は、最大でも文字列の長さ len(s) = 3 行です。
文字列が3文字しかないため、5行のうち3行だけ使われ、残りの2行は空になります。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?