这道题对我来说是真的困难,一个是我想的思路太繁琐,而且我看很多题解都用到了容器,我还没学这块
这是我最开始的思路,建立一个二维数组,把排好后的元素填进去,再按照行来挨个读取,这样过于繁琐,我没办法建立一个随时能根据填进去的内容增长长度的动态数组,只能行列都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/