ZigZag Conversion

本文介绍了一种字符串处理问题——Z字形转换,并提供了两种解决方案。一种是使用切片存储每行字符,另一种利用strings.Builder提高效率。最后还讨论了如何通过发现规律进一步优化算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


ZigZag Conversion

题目描述

  将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
图片
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。

解题思路

  直接暴力,遍历字符串的每个字符。按照行来存储输出的字符,如第一行存LCIR。每次行数都会下降或者上升一行。时间复杂度为O(n),空间复杂度为O(n)。代码如下。

func convert(s string, numRows int) string {
	if numRows == 1 {
		return s
	}
	var tmp [][]rune
	for i := 0; i < numRows; i++{
		tmp = append(tmp, make([]rune, 0))
	}
	/////先确定每个字符所在行以及先后顺序
	var cur int
	var flag int = 1
	for _, v := range s {
		tmp[cur] = append(tmp[cur], v)
		cur += flag
		if cur == 0 || cur == numRows-1{
			flag = 0-flag
		}
	}


	var res string
	for i := 0; i < numRows; i++ {
		for _, v := range tmp[i] {
			res = res + string(v)
		}
	}
	return res
}

其他

  网上其他人写的代码。有种通过golang的bytes包或者strings包来读写,这样速度会快上很多。代码如下。

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

	stringBuilders := make([]*strings.Builder, numRows)
	for i := 0; i < numRows; i++ {
		stringBuilder := &strings.Builder{}
		stringBuilders[i] = stringBuilder
	}
	
	flag := 1
	j := 0
	for _, c := range s {
		(stringBuilders[j]).WriteRune(c)
		j += flag
		if j == 0 || j == numRows-1{
			flag = 0-flag
		}
	}

	var ans strings.Builder
	for _, stringBuilder := range stringBuilders {
		ans.WriteString(stringBuilder.String())
	}

	return ans.String()
}

  或者直接模拟,找出第一个字符在原有字符串的位置,第二个字符在原有字符串的位置,每行都有特定的规律。通过规律来做。这样是最好的,省空间,省时间。时间复杂度为O(n),空间复杂度为O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值