Leetcode-- ZigZag Conversion

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

以题目中的"PAYPALISHIRING"为例

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

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

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

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


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

    public String convert(String s, int numRows) {
        if (s == null || s.length() == 0 || numRows == 1) {
            return s;
        }
        List> 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 list : store) {
            for (Character c : list) {
                sb.append(c + "");
            }
        }
        return sb.toString();
    }


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

时间提升了一半。


Leetcode-- ZigZag Conversion_第1张图片

改进后的代码:


    public String convert(String s, int numRows) {
        if (s == null || s.length() == 0 || numRows == 1) {
            return s;
        }
        List 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();
    }


你可能感兴趣的:(leetcode)