leetcode 6 Z 字形变换

2019-11-19  本文已影响0人  justonemoretry

这个题的关键在于控制到达行0或者行的最大值时往回走的问题,有点像个铁道兵,走到路的尽头就返回。

自己的解法,使用string数组,string在频繁变化时效率比较低,不过整体还可以:

class Solution {

    public String convert(String s, int numRows) {

        if (numRows == 1) {

            return s;

        }

        String[] levelString = new String[numRows];

        Arrays.fill(levelString, "");

        int forward = 1;

        int row = 0;

        for (int i = 0; i < s.length(); i++) {

            levelString[row] += s.charAt(i);    

            if (row == numRows - 1) {

                forward = -1;        

            }

            if (row == 0) {

                forward = 1;    

            }

            row += forward;                                         

        }

        String res = "";

        for (int j = 0; j < numRows; j++) {

            res += levelString[j];                

        }

        return res;                

    }

}

官方解法,使用StringBuilder,整体效率会更高,这个转向直接用!也更巧妙:

class Solution {

    public String convert(String s, int numRows) {

        if (numRows == 1) return s;

        List<StringBuilder> rows = new ArrayList<>();

        for (int i = 0; i < Math.min(numRows, s.length()); i++)

            rows.add(new StringBuilder());

        int curRow = 0;

        boolean goingDown = false;

        for (char c : s.toCharArray()) {

            rows.get(curRow).append(c);

            if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;

            curRow += goingDown ? 1 : -1;

        }

        StringBuilder ret = new StringBuilder();

        for (StringBuilder row : rows) ret.append(row);

        return ret.toString();

    }

}

上一篇 下一篇

猜你喜欢

热点阅读