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 RAnd 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"
.
算法思路:
思路1:
模拟题,找下规律。
代码:
1 public class Solution { 2 public String convert(String s, int nRows) { 3 if(s == null || s.length() <= nRows || nRows == 1) return s; 4 StringBuilder sb = new StringBuilder(); 5 for(int i = 0; i < nRows; i++){ 6 if(i == 0 || i == nRows - 1){ 7 int index = i; 8 while(index < s.length()){ 9 sb.append(s.charAt(index)); 10 index += 2 * (nRows - 1); 11 } 12 }else{ 13 int index = i; 14 while(index < s.length()){ 15 sb.append(s.charAt(index)); 16 if(index + 2 * nRows - 2 * i - 2 < s.length()){ 17 sb.append(s.charAt(index + 2 * nRows - 2 * i - 2)); 18 } 19 index += 2 * (nRows - 1); 20 } 21 } 22 } 23 return sb.toString(); 24 } 25 }
第二遍:
稍稍优化一下下:
【边界情况】:nRows == 1的时候,直接输出s
1 public class Solution { 2 public String convert(String s, int nRows) { 3 if(s == null || s.length() == 0 || s.length() <= nRows || nRows == 1 ) return s; 4 int leap = 2 * nRows - 2; 5 char[] array = s.toCharArray(); 6 StringBuilder sb = new StringBuilder(); 7 for(int i = 0; i < nRows; i++){ 8 sb.append(array[i]); 9 int j = 1; 10 while(i + j * leap < s.length()){ 11 if(i > 0 && i < nRows - 1) sb.append(array[i + j * leap - 2 * i]); 12 sb.append(array[i + j * leap]); 13 j++; 14 } 15 if(i > 0 && i < nRows - 1 && i + j * leap - 2 * i < s.length()) sb.append(array[i + j * leap - 2 * i]); 16 } 17 return sb.toString(); 18 } 19 }
FYI