ZigZag Conversion - Leetcode

26 篇文章 0 订阅

看到这个题目的时候只怪笔者太笨,编程经验太少。想了半天,开始打算用二维数组来存储,然后再输出,可是尝试了半天,没找出办法。后来看了一下网上的做法(我怎么总是要借鉴别人的!!!)说是可以找出编号的规律,然后按规律存到新建数组里就可以了。在找规律的过程中,之前也找了好半天,脑袋一团浆糊(估计是因为我在一边看康熙来了一遍算T.T),于是今天上午我就认真找了一下规律,发现并不难。
这里写图片描述

如图列出row=4的Z形,字符串编号排列规律(i表示行,j表示列):第1行和第row-1行只有在j是(row-1)的整数倍时才有字符。而第2行到第row-2行不仅有j是(row-1)的整数倍时有字符,并且在j除以(row-1)余数为row-1-i时有字符。第i行第j列字符的编号是(i+j*2)。

class Solution {
public:
    string convert(string s, int numRows) {
        string c="";
    int len = s.length();
    if(numRows==0||numRows==1) c=s; //在numRows只有一行或者为0的时候
    else{
    int i = 0;
    int j = 0;
    while (i + j * 2 < len) //第0行
    {
        if (j % (numRows - 1) == 0)
            c += s[i + j * 2];
        j++;
    }
    j = 0;
    for (i = 1; i < numRows; i++, m--) //第1行到第numRows-1行
    {
        while (i + j * 2 < len)
        {
        //在第numRows-1行时,这两种情况是一样的,所以可以把最后一行放在
        //这里面讨论
            if (j%(numRows-1)==numRows-1-i || j % (numRows - 1) == 0) c += s[i + j * 2];
            j++;
        }
        j=0;
    }
    }
    return c;
    }
};

然而这种做法的时间复杂度不够好。AC,Runtime: 68 ms

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows==0||numRows==1) return s;
        string c;
        int j=0,i=0;
        int row=numRows-1;
        //每一行情况不用分类,可以一起处理
        for( ;i<numRows;i++){
            while((i+j*2)<s.length()){
                if((j%row==row-i)||j%row==0)
                    c+=s[i+j*2];
                    j++;
            }
            j=0;
        }
        return c;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值