LeetCode 6 -- 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".


自己一上来没搞懂什么是zigzag,还以为就是多了个中点,结果怎么都不对,搞得相当复杂,权且贴上代码,当个教训吧:

 1 public class ZigzagConversion {
 2     public static String convert(String s, int numRows) {
 3         if (s == null || s.length() == 0)
 4             return s;
 5         if (numRows < 2)
 6             return s;
 7         int gap = numRows - 2;
 8         String res = "";
 9 
10         for (int i = 0; i < numRows; i++) {
11             if (i == 0) {
12                 for (int j = i; j < s.length(); j += (numRows * 2 - 2))
13                     res += s.charAt(j);
14             } else if (i == numRows - 1) {
15                 for (int j = i; j < s.length(); j += (numRows * 2 - 2))
16                     res += s.charAt(j);
17             } else {
18                 for (int j = i; j < s.length(); j += (numRows * 2 - 2)) {
19                     res += s.charAt(j);
20                     if (j + numRows * 2 - 3 - i < s.length())
21                         res += s.charAt(j + numRows * 2 - 3 - i);
22                 }
23             }
24         }
25 
26         return res;
27     }
28 
29     public static void main(String[] args) {
30         String s = "ABCDE";
31         String res = convert(s, 4);
32         System.out.println(res);
33     }
34 
35 }

问题代码,边界问题没有解决好

 1 public class Solution {
 2     public String convert(String s, int nRows) {
 3         if (s == null || s.length() <= nRows || nRows <= 1) return s;
 4         StringBuffer sb = new StringBuffer();
 5         // the first row
 6         for (int i = 0; i < s.length(); i += (nRows - 1) * 2) {
 7             sb.append(s.charAt(i));
 8         }
 9         
10         for (int i = 1; i < nRows - 1; i++) {
11             for (int j = i; j < s.length(); j+= (nRows - 1) * 2) {
12                 sb.append(s.charAt(j));
13                 if (j + (nRows - i - 1) * 2 < s.length()) {
14                     sb.append(s.charAt(j + (nRows - i - 1) * 2));
15                 }
16             }
17         }
18         // the last row
19         for (int i = nRows - 1; i < s.length(); i += (nRows - 1) * 2) {
20             sb.append(s.charAt(i));
21         }
22         return sb.toString();
23     }
24 }

后来百度了下,看到别人代码相当简洁,方知自己压根就没搞懂题目。

Zigzag:即循环对角线结构(

0       8       16      
1     7 9     15 17      
2   6   10   14   18      
3 5     11 13     19      
4       12       20      

构建n个字符串,循环为每个分别添加相应的字符,最后合并所有字符;

自己照着思路重新写了下:

 1 public class ZigzagConversion {
 2     public static String convert(String s, int numRows) {
 3         if (s == null || s.length() == 0)
 4             return s;
 5         if (numRows < 2)
 6             return s;
 7         String[] res = new String[numRows];
 8         String result = "";
 9         
10         int i = 0, j;
11 
12         while (i < s.length()) {
13             for (j = 0; j < numRows && i < s.length(); j++) {
14                 res[j] += s.charAt(i);
15                 i++;
16             }
17             for (j = numRows - 2; j > 0 && i < s.length(); j--) {
18                 res[j] += s.charAt(i);
19                 i++;
20             }
21         }
22         for(int k = 0; k < numRows;k++)
23             result += res[k];
24         return result;
25     }
26 
27     public static void main(String[] args) {
28         String s = "PAYPALISHIRING";
29         String res = convert(s, 3);
30         System.out.println(res);
31     }
32 }

只是没次字符串数组都默认初始化为null,如何覆盖还没解决,原文用C++代码如下:

 1 string convert(string s, int nRows){
 2     if(nRows == 1) return s;
 3     string res[nRows];
 4     int i = 0, j, gap = nRows-2;
 5     while(i < s.size()){
 6         for(j = 0; i < s.size() && j < nRows; ++j) res[j] += s[i++];
 7         for(j = gap; i < s.size() && j > 0; --j) res[j] += s[i++];
 8     }
 9     string str = "";
10     for(i = 0; i < nRows; ++i)
11         str += res[i];
12     return str;
13 }

发现自己一些问题:首先是不能很好的思考问题,或者说自己的思路多少总会有些偏差;其次就是边界问题,总是犯些小错误。

原文地址:https://www.cnblogs.com/myshuangwaiwai/p/4483004.html