#leetcode刷题之路6- Z 字形变换
2019-02-27 11:51:17来源:博客园 阅读 ()
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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
思路:找规律,怎么找呢?
我们换一种方式来看这道题:
例如:字符串123456789...16和字符串123456789...21
规律1:在我圈出的每一列中,同一行之间的相邻数字只差为 len=2*nRows-2,这也就意味着我们知道了第一列每一行的元素,后面的也就全部知道了。
那么问题来了,除了第一行和最后一行,其他行的相邻元素之间会多出现一个字符。。。所以在这些行中,我们要多考虑这些多余的字符。
规律2:这些多余字符的位置也是有规律的,他们和同一行的前一个元素的位置相差len-2*i,也就是说,多余字符的位置为dif=j+len-2*i
ok,按这个规律来做这个题:
#include <iostream> using namespace std; string convert(string s, int nRows) { if (nRows <2) return s; string ans=""; int len = 2 * nRows - 2; for (int i = 0; i < nRows; ++i) { for (int j = i; j < s.length(); j += len) { ans += s[j]; int dif = j +len - 2 * i; if ((i != 0) && (i != (nRows - 1)) &&(dif < s.length())) ans += s[dif]; } } return ans; } int main() { string s="abcdefghijklmn"; string ans=convert(s,3); std::cout <<ans << std::endl; return 0; }
c/c++中sizeof()、strlen()、length()、size()详解和区别
原文链接:https://www.cnblogs.com/biat/p/10440872.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 算法笔记刷题6 ( PAT 1003我要通过 ) 2020-05-08
- OI之路 2019-10-25
- 小白的C++之路——求质数 2019-10-25
- #leetcode刷题之路19-删除链表的倒数第N个节点 2019-03-13
- #leetcode刷题之路17-电话号码的字母组合 2019-03-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash