每天一道演算法題:Z字形轉換

glmapper發表於2018-03-13

題目

將字串 "PAYPALISHIRING" 以Z字形排列成給定的行數:(下面這樣的形狀)

P   A   H   N
A P L S I I G
Y   I   R
複製程式碼

之後按逐行順序依次排列:"PAHNAPLSIIGYIR"

實現一個將字串進行指定行數的轉換的函式:

string convert(string text, int nRows);
複製程式碼

convert("PAYPALISHIRING", 3) 應當返回 "PAHNAPLSIIGYIR" 。

方案

public String convert(String s, int numRows) {
    //計算字串長度
    int len = s.length();
    //兩個週期之間的列數,
    int slash = numRows - 2;
    //計算行的長度
    int rowLength = 0;
    while(len > 0){
        //豎列
        len = len - numRows;
        rowLength++;

        //斜著的一列
        for(int i = 0; i < slash && len > 0; i++){
            len--;
            rowLength++;
        }
    }

    //建立一個多一列的陣列用於儲存我們的字串,並且全部初始化為空格了
    char result[] = new char[numRows* rowLength];
    // 初始化為空格
    for (int i = 0; i < result.length; i++) { 
        result[i] = ' ';
    }
    // 當前處理的行數
    int curColumn = 0; 
    int index = 0;

    // 下面將字串寫入所謂的矩陣中
    while(index < s.length()){
        //寫入列
        for(int i = 0; i < numRows && index < s.length(); i++){
            result[rowLength * i + curColumn] = s.charAt(index);
            index++;
        }

        curColumn++;

        //寫入斜線
        for(int i = numRows - 2; i > 0 && index < s.length(); i--){
            result[rowLength * i + curColumn] = s.charAt(index);
            curColumn++;
            index++;
        }
    }



    // 去空格,定義兩個指標迴圈進行操作
    index = 0;
    // 找第一個是空格的字元位置
    while (index < s.length() && result[index] != ' ') { 
        index++;
    }
    int next = index + 1;
    while (index < s.length()) {
        // 找不是空格的元素
        while (next < result.length && result[next] == ' ') { 
            next++;
        }
        result[index] = result[next];
        index++;
        next++;
    }
    return new String(result, 0, index);
}
複製程式碼

這個題目想了兩天,之前的思路是建立一個二維陣列,然後填充,最後遍歷陣列拿到結果,但是對於很多邊界問題不太好考慮,放棄。這兩種方案的首要核心都是計算列數和對斜列的處理,沒有數學功底和抽象思維的程式設計師真的傷不起。

相關文章