leetCode 6 ZigZag Conversion

leetcode.windliang.cc/ 第一時間發佈java

題目描述(中等難度)

就是給定一個字符串,而後按寫豎着的 「z」的方式排列字符,就是下邊的樣子。app

而後按行的方式輸出每一個字符,第 0 行,第 1 行,第 2 行 ....ui

解法一

按照寫 Z 的過程,遍歷每一個字符,而後將字符存到對應的行中。用 goningDown 保存當前的遍歷方向,若是遍歷到兩端,就改變方向。spa

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();
    }
複製代碼

時間複雜度:O(n),n 是字符串的長度。code

空間複雜度:O(n),保存每一個字符須要的空間。cdn

解法二

找出按 Z 形排列後字符的規律,而後直接保存起來。blog

咱們能夠看到,圖形實際上是有周期的,0,1,2 ... 7 總過 8 個,而後就又開始重複相同的路徑。週期的計算就是 cycleLen = 2 × numRows - 2 = 2 × 5 - 2 = 8 個。leetcode

咱們發現第 0 行和最後一行一個週期內有一個字符,因此第一個字符下標是 0 ,第二個字符下標是 0 + cycleLen = 8,第三個字符下標是 8 + cycleLen = 16 。字符串

其餘行都是兩個字符。get

第 1 個字符和第 0 行的規律是同樣的。

第 2 個字符其實就是下一個週期的第 0 行的下標減去當前行。什麼意思呢?

咱們求一下第 1 行第 1 個週期內的第 2 個字符,下一個週期的第 0 行的下標是 8 ,減去當前行 1 ,就是 7 了。

咱們求一下第 1 行第 2 個而週期內的第 2 個字符,下一個週期的第 0 行的下標是 16 ,減去當前行 1 ,就是 15 了。

咱們求一下第 2 行第 1 個週期內的第 2 個字符,下一個週期的第 0 行的下標是 8 ,減去當前行 2 ,就是 6 了。

固然期間必定要保證下標小於 n ,防止越界。

能夠寫代碼了。

public String convert(String s, int numRows) {

	if (numRows == 1)
		return s;

	StringBuilder ret = new StringBuilder();
	int n = s.length();
	int cycleLen = 2 * numRows - 2;

	for (int i = 0; i < numRows; i++) {
		for (int j = 0; j + i < n; j += cycleLen) { //每次加一個週期
			ret.append(s.charAt(j + i));
			if (i != 0 && i != numRows - 1 && j + cycleLen - i < n) //除去第 0 行和最後一行
				ret.append(s.charAt(j + cycleLen - i));
		}
	}
	return ret.toString();
}
複製代碼

時間複雜度:O(n),雖然是兩層循環,但第二次循環每次加的是 cycleLen ,無非是把每一個字符遍歷了 1 次,因此兩層循環內執行的次數確定是字符串的長度。

空間複雜度:O(n),保存字符串。

總結

此次算是總結起來最輕鬆的了,這道題有些找規律的意思。解法一順着排列的方式遍歷,解法二直接從答案入口找出下標的規律。

相關文章
相關標籤/搜索