LeetCode刷题 题6.Z字形变换

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

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。

题目理解如下图所示:形状相当于将Z字先向右镜像在顺时针旋转90度


思路:
1)用vector容器来创建字符串数组;
2)对字符串s进行遍历,用vector数组按照Z字形变换来存储s中的单个字符。具体操作请看代码;
3)遍历输出vector字符串数组。

补充知识点:
bool类型的数据在进行加减法操作时,当它为false,其值为0;当它为true,其值为1。

string convert(string s, int numRows) {
        int len = s.size();
        if(numRows == 1)   //如果numRows为1,则直接返回s。
            return s;
        string res = "";
        vector rows(min(len, numRows));  /*用vector容器创建字符串数组rows用来存储各个子串。
              rows[cur]表示第cur个子串,
              rows[cur][i]表示第cur个子串的第i个字符  cur和i都是从0开始*/
        bool goingdown = false;       /*goingdown的作用是用于反转的,当cur为0或numRows-1时,这是就需要反转了。*/
        int cur = 0;
        for(char c: s){  //遍历s中的每个字符c
            rows[cur] += c;  //存储字符串
            if(0 == cur || numRows-1 == cur)  //当cur为0或numRows-1时,这是就需要反转了
                goingdown = !goingdown;
            cur += goingdown? 1:-1;    //当goingdown为true,cur+= 1,当goingdown为false,cur+= -1
        }
        for(string r : rows)  //遍历rows中的每个字符串
            res += r;
        return res;
    }

你可能感兴趣的:(LeetCode刷题 题6.Z字形变换)