这道题对我来说是真的困难,一个是我想的思路太繁琐,而且我看很多题解都用到了容器,我还没学这块

 

 

 这是我最开始的思路,建立一个二维数组,把排好后的元素填进去,再按照行来挨个读取,这样过于繁琐,我没办法建立一个随时能根据填进去的内容增长长度的动态数组,只能行列都1000,内存溢出。

我想的是i,j代表行列,存一个i++,存到底i开始--,j开始++,直到i=0,重新i++,这样过于繁琐。用了两天都没搞明白

 

我在题解中找到了一个能让我看懂的思路

 

 

 

建立一个数组ans_L,长度为numRows(行数),这个数组存的是按Z字形排好之后的每一行元素

变量now_row表示当前行数,初始为1

变量x控制行号递增(1)还是递减(0),初始为1

now_row=1或者now_row=numRows的时候改变x的值,也就是方向。

class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1) return s;
        string* arrays = new string[numRows];
        int now_row = 1;
        int x = 1;
        for (int i = 0; i < s.size(); i++) {
            if (x == 1) {
                arrays[now_row - 1] += s[i];
                now_row++;
            }
            else {
                arrays[now_row - 1] += s[i];
                now_row--;
            }
            if (now_row == numRows) x = 0;
            else if (now_row == 1) x = 1;
        }
        string result = "";
        for (int i = 0; i < numRows; i++) {
            result += arrays[i];
        }
        return result;
    }
};
int main() {
    Solution sol;
    cout << sol.convert("PAYPALISHIRING", 4) << endl;


    system("pause");
    return 0;
}
用convert("PAYPALISHIRING", 4)作为示例

 

 

 

开始时:

数组为arrays[4]={空,空,空,空 },当前行now_row = 1,方向向下,行数递增,x=1

从字符串s头遍历到尾:

  走x=1循环,数组第一个元素+=s[0];数组变成arrays[4]={P,空,空,空 }

  然后其他判断都不走,走第二遍循环,数组变成arrays[4]={P,A,空,空 }

  一直到数组变成arrays[4]={P,A,Y,P },当前行变为4,x=0;开始走递减的判断

  依次给第三,第二,第一个元素增加内容,循环结束时数组变为arrays[4]={PIN,ALSIG,YAHR,PI }

最后把数组四个元素拼接

感谢这个题解的作者让我学到了新思路,真是巧妙

原答案:https://leetcode-cn.com/problems/zigzag-conversion/solution/biao-zhu-mei-ge-zi-fu-suo-zai-xing-shu-b-e8hd/

 

posted on 2021-12-13 16:57  托马斯源  阅读(22)  评论(0编辑  收藏  举报