6. Z 字形变换

6. Z 字形变换

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

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

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"

示例 2:

输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

输入:s = "A", numRows = 1
输出:"A"

提示:

  • 1 <= s.length <= 1000
  • s 由英文字母(小写和大写)、',''.' 组成
  • 1 <= numRows <= 1000

思路:

​ 其实本质上就是给你一个n行的空间,然后按顺序把每个字符放进去,到了n行底部就转向上方。

附上别人图解一张帮助理解

img

class Solution {
public:
    string convert(string s, int numRows) {
        //模拟题  其实就是给你n行 然后按顺序向每行里面放数字
        if(numRows==1)return s;
        bool change=true;//用change来记录走的方向 从上到下或者从下到上
        int n=s.size();
        int i=0;
        int index=0;
        vector<string>res(numRows);//存储每一行的数据
        while(i<n){
            if(change==true){//如果当前方向为从上到下
                res[index]+=s[i];
                i++;
                if(index==numRows-1){
                    change=false;//走到头 那么就从下往上走
                    index--;
                    continue;
                }
                index++;
            }else{
                //从下往上走
                res[index]+=s[i];
                i++;
                if(index==0){//走到顶部
                    change=true;
                    index++;
                    continue;
                }
                index--;
            }
        }
        string ans="";
        for(string a:res){
            ans+=a;
        }
        return ans;
    }
};
posted @   BailanZ  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示