將字符串 "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);
}
複製代碼
這個題目想了兩天,以前的思路是創建一個二維數組,而後填充,最後遍歷數組拿到結果,可是對於不少邊界問題不太好考慮,放棄。這兩種方案的首要核心都是計算列數和對斜列的處理,沒有數學功底和抽象思惟的程序員真的傷不起。函數