LeetCode題解-6-ZigZag Conversion

解題思路

這個題目我是分2種情況來考慮的,考慮首行和最後一行,每個數的間隔是2*(numRows-1), 對於中間其他行,那麼的間隔是2*(numRows-1)-2*row或者2*row, 其中row表示當前所在的行號。算法是逐行掃描,計算當前符號在輸入字符串中的位置,而對應轉換後的位置不斷加1就可以了。可以看下面的圖:

  • 首行和尾行

這裏寫圖片描述

  • 其他行

這裏寫圖片描述

參考源碼

public class Solution {
    public String convert(String s, int numRows) {
        if (numRows <= 1) {
            return s;
        }

        int len = s.length();
        char[] cs = new char[len];

        int newpos = 0;
        for (int row = 0; row < numRows; row++) {
            //first or last row
            if (row == 0 || row == numRows - 1) {
                int pos = row;
                while (pos < len && newpos < len) {
                    cs[newpos] = s.charAt(pos);
                    newpos++;
                    pos += 2 * (numRows - 1);
                }
            } else {
                int pos = row;
                int dir = 0;
                while (pos < len && newpos < len) {
                    cs[newpos] = s.charAt(pos);
                    newpos++;
                    if (dir == 0) {
                        pos += 2 * (numRows - 1) - 2 * row;
                        dir = 1;
                    } else if (dir == 1) {
                        pos += 2 * row;
                        dir = 0;
                    }
                }
            }
        }
        return new String(cs);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章