leetcode 6 Z字形变换(C#)

题目

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

请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);

示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”

示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”

解释:
在这里插入图片描述

解题:

解法一:找规律。
一开始我的想法是,最左边一列可以存储numRow个字符,中间对角线(不包含顶角两点)可以存储numRow-2个字符,然后依次循环。利用矩阵来存储z字变换后的字符,然后输出矩阵。但是,矩阵matrix[i][j]坐标很难计算。

解法二:直达结果。
题目要求我们输出的结果是从左到右逐行输出,参考大神解法,直接忽略z字形这个形式,也就是说,既然输出的结果是连续的字符串,那么把z的形式压缩一下,就可以使解法简单很多。
在这里插入图片描述
可以看到,通过压缩,我们只要在遍历字符串的时候,将字符串添加至对应的row[i]就可以了。

需要注意的点:
1.row循环的顺序是:row[1]→row[2]→row[3]→row[2]→row[1]→row[2]→row[3]→row[2]→row[1]…
也就是先从上到下,到达最下一行,从下到上返回。我们可以通过设置一个flag值,来标志现在遍历的方向。限定条件是,当遍历到第一行或最后一行时,改变flag的正负来改变遍历方向。

2.StringBuilder的命名空间是using System.Text;
StringBuilder和string比较,当修改StringBuilder时,它不用开辟一个新的StringBuilder,而是直接扩充原有空间;string则是开辟一个新的string存储字符串。
StringBuilder添加字符串,使用的是StringBuilder.Append(char);添加在字符串末尾。

public string Convert(string s, int numRows) {
        if (numRows < 2) return s;
            List<StringBuilder> rows = new List<StringBuilder>();
            for(int j = 0; j < numRows; j++) { rows.Add(new StringBuilder()); }
            int i = 0, flag = -1;
            foreach (Char c in s)
            {
                rows[i].Append(c);
                if (i == 0 || i == numRows - 1) flag = -flag;
                i += flag;
            }

            StringBuilder res = new StringBuilder();
            foreach (StringBuilder row in rows)
            {
                res.Append(row);
            }
            return res.ToString();
    }

代码参考:https://leetcode-cn.com/problems/zigzag-conversion/solution/zzi-xing-bian-huan-by-jyd/
大神的图解思路很清晰,推荐去看。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值