LeetCode 6---Z字形变换

详细描述请参考

1、题目

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 :

输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"

解释:

L     D     R
E   O E   I I
E C   I H   N
T     S     G

题解

分析:
1、每行的开始字符就是处于第i个的字符;行:0~numRows

第0行:L,s[0]
第1行:E,s[1]
第2行:E,s[2]
第3行:T,s[3]

2、第0行和最后一行字符间距为:2*numRows-2

  L    D     R         间距:6---6---6
  0    6     12        间距:2*numRows-2

3、第一行字符为:

   1--5--7--11--13    间隔:4--2--4--2--  
   E  O  E   I  I,   间隔:step-2*i(行) ---2*i----step-2*i---2*i

4、第二行字符

 E     C    I    H    N         间隔:2---4---2----4
 2     4    8    10   14        间隔:step-2*i(行)---2*i ----step-2*i----2*i

5、下标不能超过字符串长度

string convert(string s, int numRows) {
        if(numRows==1)
            return s;
        string res;  //结果保存
        int index=0;  //每行字符位置
        int add = 0;  //字符间距
        int len = s.length();  //字符串长度
        int step = 2*numRows-2;
        for(int i=0;i<numRows;i++)  //当前行
        {
            index = i;   
            add = 2*i;
            while(index<len)
            {
                res+=s[index];
                add = step-add;   //每行间距
                index += (i==0 || i==numRows-1)?step:add;   //首行、末行间距相等,相差step
            }
        }
        return res;
    }

总结

把抽象的例子具体化,而后找规律,把复杂的问题简单化,通过规律写代码,事半功倍。

参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值