跟小马哥学算法leetcode_06

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

题目是 06 ZigZig Conversion

将给定的字符串按照N行排序,然后输出。个人比较傻,直接按照题目说的来。这边给个1到16的例子:

1713
2681214
3591115
41016

按照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;
    }
};

这题还有另外一种思路的解法。

048
13579
2610
0612
1571113
2481014
3915

每个满列之间的数字间隔为2*(numRow-1)。对于中间行之间的间隔为2*(numRow-1)-2*i;

具体的算法参考http://blog.csdn.net/gg543012991/article/details/53192501

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值