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".
一道数学题,参考了网上的思路,先计算一下每一个zig包含的字符个数,实际上是zigSize = 2*nRows – 2
然后一行一行的加s中的特定元素就行。
第一行和最后一行都只需要加一个字符,每一个zig,而且在s中的index间隔是zigSize。
中间每一行需要添加两个字符到结果中去。第一个字符同上;第二个字符的index就是zigSize – i。i是行index。
需要注意的是,nRows == 1一定要单独讨论,否则rsize = 2*nRows - 2 == 0,循环没有增量会成为死循环。还有18-23行添加的顺序谁先谁后是有讲究的。
第三遍代码:361ms
1 public class Solution { 2 public String convert(String s, int nRows) { 3 if (s == null || s.length() == 0) return ""; 4 if (s.length() <= nRows || nRows == 1) return s; 5 int rsize = 2 * nRows - 2; 6 StringBuffer res = new StringBuffer(); 7 for (int i=0; i<nRows; i++) { 8 if (i == 0 || i == nRows-1) { 9 int t = 0; 10 while (i + t * rsize < s.length()) { 11 res.append(s.charAt(i+t*rsize)); 12 t++; 13 } 14 } 15 else { 16 int m = 0; 17 while (i + m * rsize < s.length() || (rsize - i + m * rsize) < s.length()) { 18 if (i + m * rsize < s.length()) { 19 res.append(s.charAt(i+m*rsize)); 20 } 21 if ((rsize - i + m * rsize) < s.length()) { 22 res.append(s.charAt(rsize-i+m*rsize)); 23 } 24 m++; 25 } 26 } 27 } 28 return res.toString(); 29 } 30 }
如果不分开i =0, i=nRows-1和其他case, 444ms, 比上面反而慢一点
1 public class Solution { 2 public String convert(String s, int nRows) { 3 if (s == null || s.length() == 0) return ""; 4 if (s.length() <= nRows || nRows == 1) return s; 5 int rsize = 2 * nRows - 2; 6 StringBuffer res = new StringBuffer(); 7 for (int i=0; i<nRows; i++) { 8 int m = 0; 9 while (i + m * rsize < s.length() || (rsize - i + m * rsize) < s.length()) { 10 if (i + m * rsize < s.length()) { 11 res.append(s.charAt(i+m*rsize)); 12 } 13 if (i!=0 && i!=nRows-1 && ((rsize - i + m * rsize) < s.length())) { 14 res.append(s.charAt(rsize-i+m*rsize)); 15 } 16 m++; 17 } 18 19 } 20 return res.toString(); 21 } 22 }