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