跟着小马哥刷了LeetCode的算法,自己也顺带着理理思路。这边是小马哥的专栏——马志峰的编程笔记
将给定的字符串按照N行排序,然后输出。个人比较傻,直接按照题目说的来。这边给个1到16的例子:
1 | 7 | 13 | ||||
---|---|---|---|---|---|---|
2 | 6 | 8 | 12 | 14 | ||
3 | 5 | 9 | 11 | 15 | ||
4 | 10 | 16 |
按照Z型输出的话便成了1 7 13 2 6 8 12 14 3 5 9 11 15 4 10 16。不考虑内在的规则,直接从第一列上看,数字随着列的增加而增加,当到最后一行即第四行的时候,5变成斜向上,数字随着列的减少而增大。关键是怎么定义增加,什么时候定义减少。
当数字位于第一行的时候开始增加,当到第四行的时候开始减少。在C++中是从第0行开始,所以相对的就从第3行开始减少。
class Solution {
public:
string convert(string s, int numRows) {
}
};
leetcode上的定义是这样的,所以按照刚才的思想写的关键代码:
vector<string> vecstring(numRows); //定义numRows个空String
int row = 0;
bool change = true;
for(auto c : s)
{
auto &cstring = vecstring[row];
cstring = cstring + c; //将相同行的字符压入同一个string中。
if(row == 0)
{
change = true;
}
if(numRows - 1 == row)
{
change = false;
}
change ? (++row) : (--row); //条件为真的时候一直执行++row操作,直到遇见一个条件为假时执行--row //操作,当减到row为0时重新执行++row操作
}
代码也是参考小马哥,之前一直不明白
if(numRows - 1 == row)
{
change = false;
}
change ? (++row) : (--row);
后来才发现原来自己理解错了,自己认为每进行一次搜索都会进行对if(numRows - 1 == row)进行判断。其实当判断为假的时候会一直进行(–row)的操作。
全部代码如下:
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1)
{
return s;
}
vector<string> vecstring(numRows);
int row = 0;
bool change = true;
for(auto c : s)
{
auto &cstring = vecstring[row];
cstring = cstring + c;
if(row == 0)
{
change = true;
}
if(numRows - 1 == row)
{
change = false;
}
change ? (++row) : (--row);
}
string sResult;
for(auto b : vecstring) //最后遍历每个string,将所有的字符压入到sResult中。
{
sResult += b;
}
return sResult;
}
};
这题还有另外一种思路的解法。
0 | 4 | 8 | ||
---|---|---|---|---|
1 | 3 | 5 | 7 | 9 |
2 | 6 | 10 |
0 | 6 | 12 | ||||
---|---|---|---|---|---|---|
1 | 5 | 7 | 11 | 13 | ||
2 | 4 | 8 | 10 | 14 | ||
3 | 9 | 15 |
每个满列之间的数字间隔为2*(numRow-1)。对于中间行之间的间隔为2*(numRow-1)-2*i;
具体的算法参考http://blog.csdn.net/gg543012991/article/details/53192501;
自己也是刚接触编程这块,作为一个小白,现在只是将自己的思路写上来。