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 s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P I N
A L S I G
Y A H R
P I
MyAnswer
class Solution {
public String convert(String s, int numRows) {
int elemSize = numRows+(numRows-2);
if (s.length()<=numRows || numRows == 1 )
return s;
StringBuffer sb = new StringBuffer();
//先将字符串分成单位组块
StringBuffer [] arr= new StringBuffer[numRows];
for (int i=0;i<s.length();i++){
if (i%(elemSize)==0){
if (arr[0]==null){
arr[0] = new StringBuffer();
}
arr[0].append(s.charAt(i));
continue;
}else if (i%(elemSize)==numRows-1){
if (arr[numRows-1]==null){
arr[numRows-1] = new StringBuffer();
}
arr[numRows-1].append(s.charAt(i));
continue;
}
if (i%elemSize<numRows-1){
if (arr[i%(numRows-1)]==null){
arr[i%(numRows-1)] = new StringBuffer();
}
arr[i%(numRows-1)].append(s.charAt(i));
}else {
if (arr[(numRows-1)-(i%elemSize-(numRows-1))]==null){
arr[(numRows-1)-(i%elemSize-(numRows-1))] = new StringBuffer();
}
arr[(numRows-1)-(i%elemSize-(numRows-1))].append(s.charAt(i));
}
}
for (StringBuffer sbi:arr){
sb.append(sbi);
}
return sb.toString();
}
}
我的思路很纯朴也没什么神奇的地方,写法也很中规中矩,但是意外的是效率居然还不错。