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