题目:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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
(解释中的显示不太正确,以原题为准)
题目原链接
解题思路:
首先,要看懂题目,Z字形在此题目中是竖直的,类似N字形。
然后,不难看出来N的2竖的元素在字符串的规律,s.chat(i)对应的就是s.chat(i + 2 numRows - 2),所 大专栏 leetcode6. Z 字形变换以每一行对应的竖直元素很显然可以得到;从第二行开始,斜着的元素稍加观察可以看出是由对应竖直元素减去当前行i2得来的,所以创建一个StringBuilder每次添加一整行的元素即可。
代码如下:
class Solution {
public String convert(String s, int numRows) {
if(numRows == 1) return s;
int n = 2 * numRows - 2;
StringBuilder res = new StringBuilder();
for(int i = 0; i < numRows; i ++) {
for(int j = i; j < s.length(); j += n) {
res.append(s.charAt(j));
//第一行和最后一行没有斜着的元素
if(i != 0 && i != numRows-1) {
//对应行斜着的元素的下标
int temp = j + n - 2*i;
if(temp > 0 && temp < s.length())
res.append(s.charAt(j+n-2*i));
}
}
}
return res.toString();
}
}
代码提交结果:
成功
显示详情
执行用时 : 9 ms, 在ZigZag Conversion的Java提交中击败了99.18% 的用户
内存消耗 : 37.9 MB, 在ZigZag Conversion的Java提交中击败了97.81% 的用户
原文地址:https://www.cnblogs.com/liuzhongrong/p/12262872.html