Leetcode-- ZigZag Conversion

来源:互联网 发布:清华网络教学平台 编辑:程序博客网 时间:2024/06/16 16:07

首先要明白什么是ZigZag走法。

以题目中的"PAYPALISHIRING"为例

P   A   H   NA P L S I I GY   I   R
ZigZag走法是在走向垂直往下,再倾斜往上的

P   A   H   NA P L S I I GY   I   R
所以可以看出在交替着走红色的路和绿色的路。

红色的路是顺着的,绿色的路是逆着的。

在写代码的时候特别要注意index的问题。


一开始选用List存储字符,代码如下:

    public String convert(String s, int numRows) {        if (s == null || s.length() == 0 || numRows == 1) {            return s;        }        List<List<Character>> store = new ArrayList<>();        for (int i = 0; i < numRows; i++) {            store.add(new ArrayList<>());        }        store.get(0).add(s.charAt(0));        int start = 1;        while (start < s.length()) {            for (int i = 1; i < numRows; i++) {                if (start < s.length()) {                    store.get(i).add(s.charAt(start));                    start++;                } else {                    break;                }            }            for (int i = numRows - 2; i >= 0; i--) {                if (start < s.length()) {                    store.get(i).add(s.charAt(start));                    start++;                } else {                    break;                }            }        }        StringBuilder sb = new StringBuilder();        for (List<Character> list : store) {            for (Character c : list) {                sb.append(c + "");            }        }        return sb.toString();    }


后来,进行了改进,直接选择用StringBuilder存储。

时间提升了一半。


改进后的代码:


    public String convert(String s, int numRows) {        if (s == null || s.length() == 0 || numRows == 1) {            return s;        }        List<StringBuilder> store = new ArrayList<>();        for (int i = 0; i < numRows; i++) {            store.add(new StringBuilder());        }        store.get(0).append(s.charAt(0));        int start = 1;        while (start < s.length()) {            for (int i = 1; i < numRows; i++) {                if (start < s.length()) {                    store.get(i).append(s.charAt(start));                    start++;                } else {                    break;                }            }            for (int i = numRows - 2; i >= 0; i--) {                if (start < s.length()) {                    store.get(i).append(s.charAt(start));                    start++;                } else {                    break;                }            }        }        StringBuilder sb = new StringBuilder();        for (StringBuilder builder : store) {            sb.append(builder);        }        return sb.toString();    }


1 0
原创粉丝点击