6.ZigZag Conversion-leetcode

个人感觉这就是一道找规律的题目,所以把规律找出来问题也就迎刃而解了。

两种方法,个人感觉算法本质是一样的,因为要遍历整个字符串,所以最小时间复杂度也是O(n)。

方法一:

由于是要一行一行存储,所以可以用一个字符串数组,大小为numRows,然后遍历字符串,把当前字符存到对应的行字符串中,最后一次连接每行的字符串。关键找到字符串的每个字符下标和对应行数的关系。

class Solution {
public:
    string convert(string s, int numRows)
    {
        if(numRows<2 || s.size()<=numRows) return s;
        vector<string> ans(numRows,"");//ans[i] = 第i+1行的字符串
        int ci = 0;
        while(ci<s.size())
        {   
            for(int i=0;i<numRows && ci<s.size();)
            {
                ans[i++]+=s[ci++];   
            }
            for(int i=numRows-2;i>0 && ci<s.size();)
            {
                ans[i--]+=s[ci++];
            }
        }
        string res = "";
        for(auto st:ans){
            res+=st;
        }
        return res;
    }
};
方法二:只用一个字符串变量存储结果,因此需要依次确定每行的字符串,找完规律你会发现,第一行和最后一行规律一样,剩下的行规律一样,因此要分开计算

class Solution {
public:
    string convert(string s, int numRows)
    {
        if(numRows<2 || s.size()<=numRows) return s;
        stringstream res;
        int groupnumber = numRows*2-2; 
        for(int c=0;c<s.size();c+=groupnumber)
        {
                res<<s[c];
        }    
        for(int r=1;r<numRows-1;++r)
        {
            for(int c=r;c<s.size();c+=r*2)
            {
                res<<s[c];
                if(c<s.size() && (c+groupnumber-r*2) < s.size())
                {
                    c+=(groupnumber-r*2);
                    res<<s[c];
                }else break;
            }    
        }
        for(int c=numRows-1;c<s.size();c+=groupnumber)
        {
                res<<s[c];
               
        }    
        return res.str();
    }
};
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值