LeetCode第6题N 字形变换

267 阅读1分钟

继续打卡算法题,今天学习的是第LeetCode的第6题N字形变换,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码能力有一些帮助。

image.png

分析一波题目

给定一个字符串,需要将它按照指定的行数生成一个N字形的排列,这个题目也有技巧,如果我们想按一行一行生成会非常麻烦,但是按照一列一列生成就非常容易理解,并且代码也比较容易理解。

比如PAYPALISHIRING,指定行数是3。

第一列 从0行开始,构造第一列的

P
A
Y

第二列 这里需要注意,第一列到到最后一个了,根据n字的特性,第二列需要行数转换

P

第3列 这里又从0行开始了,构造第3列的数据

A
L
I

编码解决

class Solution {
    public String convert(String s, int numRows) {
            if(numRows < 2) return s;
        //记录每一行的字符串    
        List<StringBuilder> rows = new ArrayList<StringBuilder>();
        for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());
        //i控制行数
        int i = 0, flag = -1;
        for(char c : s.toCharArray()) {
            rows.get(i).append(c);
            //到达了最大行或者最小行,需要转换行数了 
            if(i == 0 || i == numRows -1) flag = - flag;
            i += flag;
        }
        StringBuilder res = new StringBuilder();
        for(StringBuilder row : rows) res.append(row);
        return res.toString();
    }
}

总结

这个题目是按照模拟的做法,主要是注意控制行数的转换逻辑,什么时候行要从0行开始,什么时候行数要往0行靠近。