leetcode 6st ZigZag Conversion

1.题意
输入:字符串,行数
输出:N字形镜像旋转后的字符串

2.思路
第一反应:一列列排,中间每一列只有一个字符,找空格规律
参考方案:找同一行字符串间的间隔规律,
首尾字符间差值为(2n-2)
中间行字符差值为X =(2
n-2)-2i,(2n-2)-X, (2*n-2)-X…
最后将字符串数组串起来组装成新的字符串

3.反思
思维还是太局限,应该关注输出是什么,着眼于输出于输入的关系,从其中找突破口,而不应拘泥于原字符串的顺序。

class Solution {
public:
    string convert(string s, int numRows) {
    int i = 0, n = numRows;
    string* p = new string[n];
    if (s.length() == 1 || n ==1 || n >=s.length() ) 
    {
        return s;
    }
        for(; i < n; i++)
        {
            if(i == 0|| i ==n-1)
            {
                p[i].append(s,i,1);
                int x = i+2*n-2;
                for (;x < s.length(); x = x+2*n-2)
                {
                    p[i].append(s,x,1);
                }

            } 
            else
            {
                int  x= 2*n-2-2*i;
                p[i].append(s,i,1);
                int y = i;
                for(;y+x < s.length(); x =(2*n-2)-x )
                {
                    y = y+x;
                    p[i].append(s,y,1);
                }
            }
        }  
    string outString;
    for(int z =0; z < n; z++)
    {
        outString.append(p[z]);
    }
    delete [] p;
    return outString;
    }
};

4.进步
因为逻辑分支较多,画了程序流程图

5.库的相关轮子
string类型的变量s[x]按数组形式取出来的字符不能直接作为append函数的参数,故在字符串后面插入另一个字符串的截取片段为方法应为,dest.append(src,x,1)
x为起始字符串序号,1这里表示取一个字符。
另,看了下在字符串中使用push_back的方法可以直接插入另一个字符串数组取出的字符,std库有相应的函数重载,试验了一下也可行。但性能没有append好。

ref:relative_link

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值