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

題目

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

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" 。bash

方案

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

這個題目想了兩天,以前的思路是創建一個二維數組,而後填充,最後遍歷數組拿到結果,可是對於不少邊界問題不太好考慮,放棄。這兩種方案的首要核心都是計算列數和對斜列的處理,沒有數學功底和抽象思惟的程序員真的傷不起。函數

相關文章
相關標籤/搜索