LeetCode-6 Z字形变换

思路

将Z看成多个“一竖”以及“斜线”组成,根据已知的行数可得这Z字形一竖和斜线包含的字符个数为(2numRows-2)。将整个字符串划分为长度为(2numRows-2)的若干组,变量z_sum表示划分的组数。设置二维数组,保存划分后的字符串,字符串未填满的地方用0初始化。
按行读二维数组对应的字符串,除了第一行和最后一行,同一行上竖线和斜线的两个字符串满足下标相加等于2*numRows-2。

源代码

class Solution {
public:
    string convert(string s, int numRows) {
        int length=s.length();
        int z_sum;
        int i=0,j=0,x=0,y=0;
        string res="";  //结果字符串
        
        if (numRows==1) return s;  //只有一行

        if(length%numRows==0)
            z_sum=length/numRows;   //可划分的组数
        else
            z_sum=length/numRows+1;

        char array[2*numRows-2][z_sum];  
        memset(array,'0',sizeof(array));   //数组初始化为0

        for(i=0;i<length;i++)
        {
            x=i/(2*numRows-2);
            y=i%(2*numRows-2);
            array[y][x]=s[i];
        }

        //合并结果
        for(i=0;i<numRows;i++)
        {
            for(j=0;j<z_sum;j++)
            {
                if(array[i][j]=='0')
                    continue;
                else
                {
                    res=res+array[i][j];
                    if(i!=0&&i!=numRows-1)
                    {
                        if(array[2*numRows-2-i][j]=='0')
                            continue;
                        else
                            res=res+array[2*numRows-2-i][j];
                    }
                }
            }
        }

        return res;
    }
};

总结

提交代码后发现程序占用的内存比较大,运行时间也较慢,后参考了一些优秀的代码后发现二维数组可以不用,直接在原字符串上操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值