Leetcode 6.Z字形变换

Z字形变换

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

P A H N

A P L S I I G

Y I R

之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

实现一个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入: s = "PAYPALISHIRING", numRows = 3

输出: "PAHNAPLSIIGYIR"

示例 2:

输入: s = "PAYPALISHIRING", numRows = 4

输出: "PINALSIGYAHRPI"

解释:

P I N

A L S I G

Y A H R

P I

解决方案

方法一:按行排序

思路

通过从左向右迭代字符串,我们可以轻松地确定字符位于 Z 字形图案中的哪一行。

算法

我们可以使用个列表来表示 Z 字形图案中的非空行。

从左到右迭代 sss,将每个字符添加到合适的行。可以使用当前行和当前方向这两个变量对合适的行进行跟踪。

只有当我们向上移动到最上面的行或向下移动到最下面的行时,当前方向才会发生改变。

 1 class Solution {
 2     public String convert(String s, int numRows) {
 3 
 4         if (numRows == 1) return s;
 5 
 6         List<StringBuilder> rows = new ArrayList<>();
 7         for (int i = 0; i < Math.min(numRows, s.length()); i++)
 8             rows.add(new StringBuilder());
 9 
10         int curRow = 0;
11         boolean goingDown = false;
12 
13         for (char c : s.toCharArray()) {
14             rows.get(curRow).append(c);
15             if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
16             curRow += goingDown ? 1 : -1;
17         }
18 
19         StringBuilder ret = new StringBuilder();
20         for (StringBuilder row : rows) ret.append(row);
21         return ret.toString();
22     }
23 }

 1 class Solution {
 2     public String convert(String s, int numRows) {
 3 
 4         if (numRows == 1) return s;
 5 
 6         StringBuilder ret = new StringBuilder();
 7         int n = s.length();
 8         int cycleLen = 2 * numRows - 2;
 9 
10         for (int i = 0; i < numRows; i++) {
11             for (int j = 0; j + i < n; j += cycleLen) {
12                 ret.append(s.charAt(j + i));
13                 if (i != 0 && i != numRows - 1 && j + cycleLen - i < n)
14                     ret.append(s.charAt(j + cycleLen - i));
15             }
16         }
17         return ret.toString();
18     }
19 }
 

猜你喜欢

转载自www.cnblogs.com/kexinxin/p/10162967.html