题目描述:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
我没想到太好的算法,直接模拟就好了。
设置一个指针,还有一个numRows行的StringBuilder字符串数组,遍历字符串s,指针做“之”字形摆动就好了,到了哪一行就给哪一行的StringBuilder添加一个字符,最后再把几行StringBuilder组合。
反思错误:
假如是一行的话,完全就不需要摆动了,直接返回。因为我没考虑,所以出现越界错误。
Java代码:
class Solution {
public String convert(String s, int numRows) {
if(numRows == 1)return s;
StringBuilder[] sbs = new StringBuilder[numRows];
for(int i=0;i<numRows;++i){
sbs[i] = new StringBuilder();
}
int len = s.length();
int i = 0,add = 1;//此时的i是用来走“之”字的指针,配合add摆动
for(int j=0;j<len;++j){
sbs[i].append(s.charAt(j));
if(i == numRows-1){//走到底了,该往上走了
add = -1;
}else if(i == 0){//在第一行需要向下一行走
add = 1;
}
i += add;
}
StringBuilder res = new StringBuilder();
for(int p=0;p<numRows;++p){
res.append(sbs[p]);
}
return res.toString();
}
}
执行结果:
通过
显示详情执行用时 :6 ms, 在所有 java 提交中击败了89.85%的用户
内存消耗 :38.7 MB, 在所有 java 提交中击败了95.20%
的用户