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).有了这些条件,我们就能将原字符串映射为之字形的字符串,具体做法如下:

  1. 从下标0开始,取出所有间距为STEP的元素;
  2. 从下标1开始,取出间距为N的元素,N是一个变化的值,初始值为4,接着变为2,接着又变为4
  3. ......
  4. 从下标i开始,取出间距N=STEP-2*i的元素,接着取出间距为N=STEP-N的元素,两次连续的间距之和为STEP
  5. 若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 之字形转换字符串的更多相关文章

  1. 【LeetCode】6. ZigZag Conversion Z 字形变换

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:字形变换,ZigZag,题解,Leetcode, 力扣,P ...

  2. 【LeetCode】ZigZag Conversion(Z 字形变换)

    这道题是LeetCode里的第6道题. 题目要求: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...

  3. 【LeetCode】6. ZigZag Conversion 锯齿形转换

    题目: 思路: 以图为例:s={'A','B','C','D','E','F','G','H'.....} 1.先不考虑中间元素F.G.H.N...,每一行前后元素在数组中对应下标相差size=2*n ...

  4. 字符串按照Z旋转90度然后上下翻转的字形按行输出字符串--ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  5. Leetcode 6 ZigZag Conversion 字符串处理

    题意:将字符串排成Z字形. PAHNAPLSIIGYIR 如果是5的话,是这样排的 P     I AP   YR H L G N  SI A    I 于是,少年少女们,自己去找规律吧 提示:每个Z ...

  6. LeetCode 6. ZigZag Conversion & 字符串

    ZigZag Conversion 看了三遍题目才懂,都有点怀疑自己是不是够聪明... 就是排成这个样子啦,然后从左往右逐行读取返回. 这题看起来很简单,做起来,应该也很简单. 通过位置计算行数: P ...

  7. LeetCode ZigZag Conversion(将字符串排成z字型)

    class Solution { public: string convert(string s, int nRows) { string a=""; int len=s.leng ...

  8. No.006 ZigZag Conversion

    6. ZigZag Conversion Total Accepted: 98584 Total Submissions: 398018 Difficulty: Easy The string &qu ...

  9. LeetCode--No.006 ZigZag Conversion

    6. ZigZag Conversion Total Accepted: 98584 Total Submissions: 398018 Difficulty: Easy The string &qu ...

随机推荐

  1. QQ群成员发言次数统计(词云制作)

    所用数据来自于之前的一篇博客: <QQ群成员发言次数统计(正则表达式版)> 链接:http://www.cnblogs.com/liyongzhao/p/3324026.html 1.首先 ...

  2. Routemanage类方法详解

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Ref ...

  3. python中的文件处理

    一 文件操作 (----------------------------------------------------------------------) 一 介绍 计算机系统分为:计算机硬件,操 ...

  4. 分类问题的几个评价指标(Precision、Recall、F1-Score、Micro-F1、Macro-F1

    轉自 https://blog.csdn.net/sinat_28576553/article/details/80258619 四个基本概念TP.True Positive   真阳性:预测为正,实 ...

  5. vue-cli环境配置

    1.安装npm 从node.js官网下载并安装node node -v 命令,查看node的版本,若出现相应的版本号,则说明你安装成功了. npm包管理器,是集成在node中的,所以安装了node也就 ...

  6. 从零开始编译Poco C++和VS2015环境配置

    Poco C++是一个C++的开源框架,详细介绍可以问百度介绍更详细,这里我就记录下我从零编译poco-1.9.0和配置 VS2015的环境,以备不时之需. 步骤:一.安装cmake: 二.编译poc ...

  7. Redis配置不当致使root被提权漏洞

    Redis配置不当致使root被提权漏洞 Dear all~ 最近Redis服务被曝出因配置不当,可能造成数据库被恶意清空,或被黑客利用写入后门文件造成进一步入侵,请关注! 一.漏洞发布日期 2015 ...

  8. vscode "find all references" 提示: no result found.

        vscode(visual studio code) 是微软推出的一款编辑器.免费,跨平台,最主要是轻便,消耗资源少, 成为码农阅读code的利器. vscode可以安装第三方的一些插件,满足 ...

  9. EMQ消息队列初体验

    使用命令创建admin用户,密码123 emqx_ctl users add admin 配置规则/etc/emqx/acl.conf(除管理员,其他用户只能订阅限定的测试主题路径) %% 允许'ad ...

  10. redis的pub/sub命令

    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...