Z字型變換(Go,LeetCode)

目錄

題目描述

解決方案

代碼

代碼走讀

傳送門


 

題目描述

將一個給定字符串根據給定的行數,以從上往下、從左到右進行Z字形排列。

比如輸入字符串爲 LEETCODEISHIRING ,行數爲3時,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之後,你的輸出需要從左往右逐行讀取,產生出一個新的字符串:LCIRETOESIIGEDHN

 

解決方案

使用模擬法解決形象生動。

假設行數爲n,我們生成n個列表表示成n行,定義一個指針變量模擬Z字形走向:從第1行依次往下,到達最後一行後在往上走,重複該循環,直到所有元素都被遍歷完。

指針變量每走到一個元素,就將該元素插入到對應行數的列表中。最終將每一行字符連接輸出,得到想要的結果。

複雜度分析:因爲只需要遍歷一遍字符串,因此時間複雜度爲 O(n)。只需要定義常數個變量,因此空間複雜度爲 O(1) 。

 

代碼

package main

import (
	"fmt"
	"strings"
)

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

	pool := make([][]string, 0)
	for i := 0; i < numRows; i++ {
		pool = append(pool, make([]string, 0))
	}
	down := false
	currentLine := 0

	for _, c := range s {
		if currentLine == 0 || currentLine == numRows-1 {
			down = !down
		}

		pool[currentLine] = append(pool[currentLine], string(c))
		if down {
			currentLine++
		} else {
			currentLine--
		}
	}

	result := ""
	for i := range pool {
		line := strings.Join(pool[i], "")
		result += line
	}
	return result
}

 

代碼走讀

package main

import (
   "fmt"
   "strings"
)

func convert(s string, numRows int) string {
   // 如果給定的行數只有一行,那麼只需要將原字符串返回
   if numRows == 1 {
      return s
   }

   // 初始化存儲每一行字符的二維切片
   pool := make([][]string, 0)
   for i := 0; i < numRows; i++ {
      pool = append(pool, make([]string, 0))
   }

   // down變量用來模擬Z字型遊標的走向(flase向上,true向下)
   down := false

   // 遊標指針變量,表示當前行數
   currentLine := 0

   for _, c := range s {
      // 如果遊標抵達邊界,需要改變方向
      if currentLine == 0 || currentLine == numRows-1 {
         down = !down
      }

      // 對應行添加字符
      pool[currentLine] = append(pool[currentLine], string(c))
      if down {
         currentLine++
      } else {
         currentLine--
      }
   }

   // 按照每一行字符依次拼接的方式輸出結果
   result := ""
   for i := range pool {
      line := strings.Join(pool[i], "")
      result += line
   }
   return result
}

// 自測用例
func main() {
   fmt.Println(convert("LEETCODEISHIRING", 3))
}

 

傳送門

LeetCode試題鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章