FTPrep, 6 Zigzag conversion

看到这题,第一反应还是第一次做时,特别长的代码和在纸上反复画图找规律的印象。。。

那显然不是应该出现的解法,但是还是很清楚的思路。参靠了之前的算法,代码和思路瞬间清楚,抓住几个关键点,1分钟搞定,关键还是要有画面感

1,看出重复区的大小是 jump = (2*rowNums - 2),这个是非常显而易见且有用的。visualization的话就是,每一个这个大小的substring 从水平变成了竖直方向,这样从一条线变成了一个矩阵。虽然不是矩阵,但是有明显的规律可循。

2,对于斜着网上走的那一段,任然需要visualization了。这个斜上方走的情况只出现在第一行和最后一行的中间部分,对于index j 的这个往下走的左边,它右边的字母的坐标有没有一个通项公式呢?有的!那就是 j+ jump - 2*i  !!! 这个公式非常 犀利,有了这个公式,代码就好写了。

3,对于每一个要作为 index的变量都要用 < len 来限制。

代码清晰入下:

public class Solution {
    public String convert(String s, int numRows) {
        int len = s.length();
        if(len==0 || numRows<=0) return "";
        
        if(numRows==1) return s;
        
        StringBuilder result= new StringBuilder();
        int jump = 2*numRows - 2;
        for(int i=0; i<numRows; i++){
            for(int j=i; j<len; j+=jump){
                result.append(s.charAt(j));
                if(i!=0 && i!=numRows-1 && (j+jump-2*i)<len){
                    result.append(s.charAt(j+jump-2*i));
                }
            }
        }
        return result.toString();
    }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值