水一下废话,这道题第一次遇到的时候不知道为什么想到的思路是找出数学规律。。。然后就花了很多时间,而且效果不好(太久没动脑,有点动不起来了hhh)。后面看了题解以后才发现其实有十分简单的办法。

解题思路:

  1. 给每个字符一个行号
  2. 假定给定行数为num,当行号从1开始,一直递增到num,然后行号从num开始递减至1,然后反复...(其实很有规律对吧🌚)

老规矩,不多讲 show code

class Solution {
    public String convert(String s, int numRows) {
        if (numRows == 1) return s;
        // 1. 给每个字符创建对应的行号 2.按照行号输出
        char[] chs = s.toCharArray();
	// 创建对应行数的动态数组
        List[] rows = new ArrayList[numRows];
        for (int i = 0; i < numRows ;i ++ ) {
	    // 初始化arrayList,否则默认为null
            rows[i] = new ArrayList();
        }
        int floor = 1 ;
        boolean direct = true;
        for (int i = 0;i< chs.length ;i ++) {
            rows[floor - 1].add(chs[i]);
            if(direct) {
                floor ++;
            } else {
                floor --;
            }
	    // 1到num时候反转
            if (floor == 1 || floor == numRows) direct = !direct;
        }

        StringBuffer sb = new StringBuffer();
        for(List list : rows) {
            for(int j = 0; j < list.size();j ++) {
                sb.append(list.get(j));
            }     
        }

        return sb.toString();
        
    }
}

Q.E.D.


每一个平凡的日常都是连续的奇迹