LeetCode--006--Z字型变换(java)

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"

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

string convert(string s, int numRows);

示例 1:

输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"

示例 2:输入: s = "LEETCODEISHIRING", numRows = 4 输出: "LDREOEIIECIHNTSG" 解释: 

L     D     R
E   O E   I I
E C   I H   N
T     S     G


分析:
竖着看,看每个字符属于第几行,每一行为一个string,最后把每一行都连接起来。行索引index和总行数的关系为index = i %(2 * rowNums - 2),
当index小于总行数,index不变,否则index = 2 * rowNums - 2 - index,比如第二列的c,index = 2 * 4 - 2 - 4 = 2;

 1 class Solution {
 2     public String convert(String s, int numRows) {
 3         if(numRows<=1)return s;
 4         StringBuilder[] sb = new StringBuilder[numRows];
 5         for(int i = 0;i < sb.length;i++){
 6             sb[i] = new StringBuilder("");
 7         }
 8         for(int i = 0;i <s.length();i++){
 9             int index = i %(2 * numRows - 2);
10             index = index < numRows ? index : 2*numRows - 2 - index;
11             sb[index].append(s.charAt(i));
12         }
13         for(int i = 1;i < sb.length;i++){
14             sb[0].append(sb[i]);
15         }
16         return sb[0].toString();
17     }
18 }

 2019-03-13 22:52:42

posted @ 2019-03-13 22:52  Assange  阅读(313)  评论(0编辑  收藏  举报