微信搜索:编程笔记本。获取更多干货!
微信搜索:编程笔记本。获取更多干货!
点击上方蓝字关注我,我们一起学编程
欢迎小伙伴们分享、转载、私信、赞赏
今天跟小伙伴们分享一道关于字符串变形的问题。恰好有小伙伴在昨晚(2020/08/12)的华为笔试中遇到相似的题目,下面分享的是 LeetCode 上一道同类型题目。
微信搜索:编程笔记本。获取更多干货!
微信搜索:编程笔记本。获取更多干货!
为了不泄漏华为的笔试原题,请有需要的小伙伴转去公众号主页,添加我为好友后,私下交流分享。另外,感谢 “spz” 小伙伴对编程笔记本提出的建议!
下面让我们开始吧!
字符串变形
题目描述:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETCODEISHIRING"
,行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
微信搜索:编程笔记本。获取更多干货!
微信搜索:编程笔记本。获取更多干货!
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"
。
分析:
因为不管怎么样,最终生成的 Z 形字符串只有三行,并且结果是这三行的连接。那么,我们只需要关心字符串中的字符应该所处的行数,将该字符缀到相应行的尾部即可。再观察一下示例,行数是先向下增长,再向上减小的。这个往复运动可以用一个增量来控制,我们只需要维护增量的值即可(+1、-1)。
参考代码:
class Solution {
public:
string convert(string s, int numRows) {
if (numRows <= 1) {
return s;
}
string res;
vector<string> ans(numRows); /* 存储每行的字符 */
int delta = -1;
int row = 0;
int idx = 0;
while (idx < s.size()) {
// 换向
if (row == numRows - 1 || row == 0) {
delta = -delta;
}
ans[row] += s[idx++];
// 换行
row += delta;
}
// 连接答案
for (int i = 0; i < numRows; ++i) {
res += ans[i];
}
return res;
}
};
**参考:**LeetCode 第六题:Z 字形变换。(https://leetcode-cn.com/problems/zigzag-conversion/)
微信搜索:编程笔记本。获取更多干货!
微信搜索:编程笔记本。获取更多干货!