博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Z字型变换(Go,LeetCode)
阅读量:4189 次
发布时间:2019-05-26

本文共 1821 字,大约阅读时间需要 6 分钟。

目录


 

题目描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行Z字形排列。比如输入字符串为 LEETCODEISHIRING ,行数为3时,排列如下:

L   C   I   RE T O E S I I GE   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串:LCIRETOESIIGEDHN

 

解决方案

使用模拟法解决形象生动。

假设行数为n,我们生成一个二元切片,长度为n,表示成n行,定义一个指针变量模拟Z字形走向:从第1行依次往下,到达最后一行后在往上走,重复该循环,直到所有元素都被遍历完。指针变量每走到一个元素,就将该元素插入到对应行数的切片中。最终将每一行字符连接输出,得到想要的结果。

复杂度分析:因为只需要遍历一遍字符串,因此时间复杂度为 O(n)。只需要定义常数个变量,因此空间复杂度为 O(1) 。

 

代码

package mainimport (	"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 mainimport (   "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))}

 

传送门

转载地址:http://wcsoi.baihongyu.com/

你可能感兴趣的文章
JAVA中ListIterator和Iterator详解
查看>>
目标和
查看>>
跳跃游戏
查看>>
买卖股票的最佳时机 II
查看>>
分发饼干
查看>>
最低票价
查看>>
删列造序
查看>>
使括号有效的最少添加
查看>>
令牌放置
查看>>
回溯法思想
查看>>
子集和问题
查看>>
旅行售货员问题
查看>>
区域和检索 - 数组不可变
查看>>
整数分解
查看>>
最长有效括号
查看>>
救生艇
查看>>
Android中自定义圆形图片(一)
查看>>
Android中ViewPager自动加手动轮播
查看>>
Android中Fragment点击切换与添加ViewPager滑动切换
查看>>
Java多线程-阻塞队列BlockingQueue
查看>>