博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法刷题】按形状排列字符-字符串变形
阅读量:3926 次
发布时间:2019-05-23

本文共 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; vector
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/)

微信搜索:编程笔记本。获取更多干货!

微信搜索:编程笔记本。获取更多干货!

你可能感兴趣的文章
uva 357 - Let Me Count The Ways(动态规划-注意dp初始化的问题)
查看>>
uva 562 - Dividing coins(注意判断条件,可以转换成01背包做)
查看>>
***uva 348 最优数组乘法序列(记忆化搜索+输出路径)
查看>>
js实现页面复选框checkbox记忆功能
查看>>
uva 10285 - Longest Run on a Snowboard(dp+记忆化搜索)
查看>>
uva 10404 - Bachet's Game(DP)
查看>>
uva 620 - Cellular Structure
查看>>
uva 10069 - Distinct Subsequences(大数相加+DP)
查看>>
uva 10651- Pebble Solitaire(状态压缩DP)待看。。。
查看>>
uva 10306 - e-Coins(二维完全背包)
查看>>
uva 10739 - String to Palindrome(带增删改操作的回文串问题)
查看>>
动态规划---最短编辑距离
查看>>
最长公共子序列+打印路径
查看>>
堆的各种操作
查看>>
最优二叉搜索树
查看>>
hdu 1008 Elevator
查看>>
hdu 1005 Number Sequence(数学题目,好好看)
查看>>
zoj 2106 Tick and Tick(比较好的数学题目,代码特麻烦,注意精度)
查看>>
zoj 2107 Quoit Design(最近点对问题,好好思考,分治)
查看>>
zoj 2111 Starship Troopers(树形DP)
查看>>