跟小马哥学算法leetcode_06

跟着小马哥刷了LeetCode的算法,自己也顺带着理理思路。这边是小马哥的专栏——马志峰的编程笔记

题目是 06 ZigZig Conversion

将给定的字符串按照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;

自己也是刚接触编程这块,作为一个小白,现在只是将自己的思路写上来。

你可能感兴趣的:(跟小马哥刷算法,leetcode,算法)