问题:
ZigZag Conversion
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".
思路:这是数组的技巧方法,算法上不算太难。如下:
public String convert(String s, int numRows) {
int len = s.length();
if(len <= numRows || numRows == 1){
return s;
}
char[] c = s.toCharArray();
String[][] arr = new String[numRows][len/numRows + 1];
int count = 0;//已填充数据总数
int k = 0;
//是否结束循环标记,加上此标记可以提高约50%的效率
boolean isBreak = false;
for(int i=0;i<len;i++){//按列填充数据
if(isBreak){
break;//字符串已读完,结束循环
}
for(int j = 0; j < numRows; j++){
if(count == len){
isBreak = true;//字符串已读完,结束循环
break;
}
//第j行第i列
if((k = i % (numRows - 1)) == 0)
arr[j][i] = c[count++] + "";
else{
arr[numRows -1 - k][i] = c[count++] + "";
break;
}
}
}
//输出数据
count = 0;
StringBuffer sb = new StringBuffer("");
isBreak = false;
for(int i = 0; i < numRows;i++){
if(isBreak){
break;//字符串已读完,结束循环
}
for(int j = 0; j < len; j++){
if(arr[i][j] != null){
System.out.print(arr[i][j]);
sb.append(arr[i][j]);
if(++count == len){
isBreak = true;//字符串已读完,结束循环
break;
}
}
}
}
System.out.println("");
return sb.toString();
}