[leetcode]ZigZag Conversion

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

算法思路:

思路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

原文地址:https://www.cnblogs.com/huntfor/p/3864307.html