ZigZag Conversion 之字形转换字符串
1.题目
The string "PAYPALISHIRING"
is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation: P I N
A L S I G
Y A H R
P I
题目大意是要求将一个给定字符串转换为之字形字符串,示意图如下:

2.思路
读完题后第一想法是,找出一种映射关系使得原字符串的下标能够映射为之字形的二维坐标,以题目中给的字符串"PAYPALISHIRING"为例,假定numRows为4,则该二维数组最多4行(若字符串长度小于numRows则不足4行,只有strlen(s)行),但如果这么做,将会浪费大量的空间,而且最终要求返回的字符串长度与输入字符串的长度是相等的,应该存在更简单的做法.
仔细观察变换后的之字形字符串,对于水平方向第一行和最后一行的元素来说,实际上就是原字符串中间距为STEP的元素,其中STEP=2*(numRows-1).还是以"PAYPALISHIRING"为例,设numRows为4,则第一行的元素是:
S[0]='P',S[6]='I',S[12]='N';
最后一行的元素是:
S[3]='P',S[9]='I';
但对于中间的行来说,两个元素间的间距是变化的,所幸这种变化也有规律可循,那就是两次连续的间距之和等于STEP,这样如果我们知道起始两个元素的间距,后面所有元素的间距都能计算出来.从示意图中容易发现,行号越小则起始两元素的间距越大,可以猜测间距应该是一个跟行号相关的变量,实际上行号每加1,间距就减少2,间距减少到0的时候则回绕为STEP.(设第一行起始两个元素的下标为begin,end,对于本例来说begin=0,end=6,那么第二行的起始两个元素的下标就是begin = begin + 1, end = end - 1,显然间距减少了2).有了这些条件,我们就能将原字符串映射为之字形的字符串,具体做法如下:
- 从下标0开始,取出所有间距为STEP的元素;
- 从下标1开始,取出间距为N的元素,N是一个变化的值,初始值为4,接着变为2,接着又变为4
- ......
- 从下标i开始,取出间距N=STEP-2*i的元素,接着取出间距为N=STEP-N的元素,两次连续的间距之和为STEP
- 若i等于numRows则循环终止
3.实现
char* convert(char* s, int numRows) {
size_t len, i, j, k, m, step;
char *ret; if (numRows == )
return s; len = strlen(s);
ret = malloc((len + ) * sizeof(char)); k = ; /* 转换后的字符串下标 */
m = * (numRows - );
for (i = ; i < numRows; ++i) {
step = m - * i > ? m - * i : m;
for (j = i; j < len; ) {
ret[k++] = s[j];
j += step;
step = m - step > ? m - step : m;
}
}
ret[len] = ;
return ret;
}
虽然整个算法是两层for循环,但时间复杂度并不是O(n2)而是O(n),因为整个算法保证对原字符串每个字符只处理一次,比较直观的解释是内层循环的步长是跳跃式的.
ZigZag Conversion 之字形转换字符串的更多相关文章
- 【LeetCode】6. ZigZag Conversion Z 字形变换
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:字形变换,ZigZag,题解,Leetcode, 力扣,P ...
- 【LeetCode】ZigZag Conversion(Z 字形变换)
这道题是LeetCode里的第6道题. 题目要求: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...
- 【LeetCode】6. ZigZag Conversion 锯齿形转换
题目: 思路: 以图为例:s={'A','B','C','D','E','F','G','H'.....} 1.先不考虑中间元素F.G.H.N...,每一行前后元素在数组中对应下标相差size=2*n ...
- 字符串按照Z旋转90度然后上下翻转的字形按行输出字符串--ZigZag Conversion
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- Leetcode 6 ZigZag Conversion 字符串处理
题意:将字符串排成Z字形. PAHNAPLSIIGYIR 如果是5的话,是这样排的 P I AP YR H L G N SI A I 于是,少年少女们,自己去找规律吧 提示:每个Z ...
- LeetCode 6. ZigZag Conversion & 字符串
ZigZag Conversion 看了三遍题目才懂,都有点怀疑自己是不是够聪明... 就是排成这个样子啦,然后从左往右逐行读取返回. 这题看起来很简单,做起来,应该也很简单. 通过位置计算行数: P ...
- LeetCode ZigZag Conversion(将字符串排成z字型)
class Solution { public: string convert(string s, int nRows) { string a=""; int len=s.leng ...
- No.006 ZigZag Conversion
6. ZigZag Conversion Total Accepted: 98584 Total Submissions: 398018 Difficulty: Easy The string &qu ...
- LeetCode--No.006 ZigZag Conversion
6. ZigZag Conversion Total Accepted: 98584 Total Submissions: 398018 Difficulty: Easy The string &qu ...
随机推荐
- js正則匹配经纬度(经纬度逗号隔开)
谷歌坐標:31.2807691689,112.5382624525 高德坐標:31.2807691689,112.5382624525 regexp: {//正则验证 regexp: /^([0-9] ...
- Firebird Embedded 部署的一个坑
今天把旧程序升级了,把DBX组件换成了FireDac组件,在虚拟机里测试的时候,一直报上图中的错误,但是在主机上运行无问题,之前用户使用也一直没报过这个错. 折腾了又折腾,还是搞不定,感觉脑袋有点大了 ...
- 漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?(转)
知乎链接:https://zhuanlan.zhihu.com/p/57354304 1. 锁的由来? 学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可 ...
- Linux基础入门-文件打包与解压缩
文件打包与解压缩: Windows上常见的压缩文件后缀有*.zip(zip程序打包压缩), *.rar(rar程序压缩), *.7z(7zip程序压缩),在Linux上常见的还有*.gz(gzip程序 ...
- python中的文件处理
一 文件操作 (----------------------------------------------------------------------) 一 介绍 计算机系统分为:计算机硬件,操 ...
- js赋值后,不影响源变量的方法。
以前都没发现这个问题,特记录一下. var productListData={pages:001}; var data=productListData;//这样就会有问题. data=$.extend ...
- python3-基础6
函数嵌套调用: 再调用一个函数的过程中,又调用了其他的函数 函数的嵌套定义:在一个函数的内部,又定义另外一个函数,函数内部定义的变量,在外部不能被调用 名称空间:一种隔离的概念,专门用来存放名字的地方 ...
- .NET版本与CLR版本及兼容性
WIN7原生的.net是2.0和3.5,打开和关闭windows功能里面可以看到.另外C:\Windows\Microsoft.NET\Framework下面也能看到..net framework1. ...
- TCP/IP学习20180710-数据链路层-ICMP协议
1.ICMP协议IP协议不保证数据送达.则应有协议保证数据送达.ICMP就是其中的重要协议.ICMP:(Internet Control Messages Protocol)因特网信报控制协议当传送I ...
- Elasticsearch-6.7.0系列(三)5601端口 kibana——ES的UI界面
https://artifacts.elastic.co/downloads/kibana/kibana-6.7.0-linux-x86_64.tar.gz Kibana下载 有了elast ...