C++算法:Z字形变换---二维数组和char[]

leetcode相关C++算法解答: https://github.com/Nereus-Minos/C_plus_plus-leetcode

题目:

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

示例1:

比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L       C     I       R
E T   O E S   I   I     G
E       D    H       N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。

示例 2:

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

思路一:

(使用二维数组坐中间量)
1.特殊情况:if(s.length() == 0 || s.length() <= numRows || numRows == 1) return s;
2.建立二维数组,存放每行的子串,空字符用空格表示vector> a(numRows, vector(s.length()));
3.最终返回值 char* ret = new char[s.length()+1]; //必须多一个来作为终止符!!!
4.最后需要 //添加终止符 ret[ret_len] = 0;

代码:

#if 1
class Solution {
public:
    string convert(string s, int numRows) {
        
        //特殊情况,空字符串   特殊情况,numRows==1 特殊情况s长度<=numRows
        if(s.length() == 0 || s.length() <= numRows || numRows == 1)
            return s;
        
        //思路;建立二维数组,存放每行的子串,空字符用空格表示
        vector> a(numRows, vector(s.length()));
        char* ret = new char[s.length()+1];  //必须多一个来作为终止符!!!
        
        for(int l = 0, step = 0; s[l] != 0; step++)
        {
            int line = step % (numRows-1);
            for(int i = 0; i < numRows; i++)    
            {
                 //终止条件
                    if(s[l] == 0)
                    {
                        line = numRows;
                        break;
                    }

                //一次分numRows列,
                if(line == 0) //第一列
                {
                    a[i][step] = s[l++]; 
                }
                else
                {
                    if(i == (numRows - line - 1))  
                        a[i][step] = s[l++];
                    else
                        a[i][step] = ' ';
                }
            }
           
        }
        
        //重构成输出
        int ret_len = 0;
        for(int m = 0, re=0; m < numRows; m++)
        {
            for(int n = 0; a[0][n] != 0; n++) //不能用a[0].length()==s.length(),不对
            {
                if(a[m][n] != ' ' && a[m][n] != 0)
                {
                    ret[re++] = a[m][n];
                    ret_len++;
                }
            }
        }
        //添加终止符
        ret[ret_len] = 0;
        
        return ret;
    }
};
#endif

你可能感兴趣的:(C++算法)