ソースを参照

add 'ZigZag Conversion' error

tangs 5 年 前
コミット
a68336ec75
1 ファイル変更87 行追加0 行削除
  1. 87 0
      tags/string/zigZagConversion/main.go

+ 87 - 0
tags/string/zigZagConversion/main.go

@@ -0,0 +1,87 @@
+package main
+
+import "fmt"
+
+func main() {
+	var s string
+	var numRows int
+
+	s = "A"
+	numRows = 1
+	fmt.Println(convert(s, numRows))
+
+	s = "AB"
+	numRows = 1
+	fmt.Println(convert(s, numRows))
+
+	s = "ABC"
+	numRows = 2
+	fmt.Println(convert(s, numRows))
+
+	s = "PAYPALISHIRING"
+	numRows = 3
+	fmt.Println(convert(s, numRows))
+
+	s = "PAYPALISHIRING"
+	numRows = 4
+	fmt.Println(convert(s, numRows))
+}
+
+func convert(s string, numRows int) string {
+	if numRows == 1 {
+		return s
+	}
+	var mp = make([][]string, numRows)
+	var vertical, horizontal int
+	var cursor = 0
+	var ch string
+	var strs []string
+	var isVertical = true
+	for cursor < len(s) {
+		ch = string(s[cursor])
+		if isVertical {
+			strs = mp[vertical]
+			strs = append(strs, ch)
+			mp[vertical] = strs
+		} else {
+			for i := 0; i < numRows; i++ {
+				strs = mp[i]
+				if i == vertical {
+					strs = append(strs, ch)
+				} else {
+					strs = append(strs, " ")
+				}
+				mp[i] = strs
+			}
+		}
+
+		if (horizontal)%(numRows-1) == 0 {
+			if !isVertical {
+				vertical = -1
+			}
+			isVertical = true
+			vertical++
+		} else {
+			isVertical = false
+			vertical--
+		}
+		if isVertical && vertical == numRows-1 {
+			horizontal++
+		}
+		if !isVertical {
+			horizontal++
+		}
+		cursor++
+	}
+
+	// print
+	var ans string
+	for i := 0; i < len(mp); i++ {
+		for j := 0; j < len(mp[i]); j++ {
+			if mp[i][j] != " " {
+				ans += mp[i][j]
+			}
+		}
+	}
+	return ans
+}