
- 1.题目描述
- 2.解题思路
- 3.我的代码
- 4.官方写法
- 5.结语
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
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
示例 3: 输入:s = "A", numRows = 1 输出:"A"
提示:
1 <= s.length <= 1000 s 由英文字母(小写和大写)、',' 和 '.' 组成 1 <= numRows <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我一般解题的时候都会在纸上画一画,看看会有什么规律,其实也很容易看出来规律的。
如:
示例 2: 输入:s = "PAYPALISHIRING", numRows = 4 输出:"PINALSIGYAHRPI" 解释: P I N A L S I G Y A H R P I
我们把最上面的看成顶层0层,把下面的看成底层(numRows - 1),容易看出,规律是这样的,按层来看:
0->1->2->3->2->1->0->1->2->3->2->1->0->1
这样我们就可以如下的解题思路。
(1)取n = 0;//表示当前层数
(2)取flag = true;//决定层数增加还是减少,true的时候增加,false的时候减少。
(3)string r[numRows];//保存每层对应的字符串
(4)i = 0;
(5)i小于s.size(),则取s[i],r[n] += s[i],否则执行(11);
(6)如果n等于numRows,说明已经到最底层,flag=false,表示层数要往顶层减,
(7)如果n == 0的话,说明在最顶层,flag=true,表示层数要往底层加,
(8)如果flag等于true且(n +1) 小于numRows,则n++;
(9)如果flag等于false且(n - 1)大于等于0,n–;
(10)i++;
(11)string res = r[0] +…+r[numRows];//逐层相加起来就得到答案了。
string convert(string s, int numRows) {
string r[numRows];
for(int i = 0;i= 0){
n--;
}
}
string res = "";
for(string si: r) {
res = res + si;
}
return res;
}
结果
看了题解也有这个思路的,不过代码简洁,我的其实还是做了一些多余 *** 作,判断多了。
代码
string convert(string s, int numRows) {
if(numRows == 1) {
return s;
}
string ans[numRows];
int slen = s.size();
int n = 0;
bool goDown = false;
for(char c: s){
ans[n] += c;
if(n == 0 || n == numRows - 1) {
goDown = !goDown;
}
n += goDown ? 1 : -1;
}
string res = "";
for(string s: ans) {
res += s;
}
return res;
}
结果
尽量减少多余 *** 作,代码力求简洁。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)