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. 剑指offer 12.代码的完整性 数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.   本人渣渣代码: public double Power(double ba ...

  2. Git 日常操作

    本地新建Git库步骤: 初始化git库:git init 建立本地和远程的关联: git remote add origin ip:端口/ 项目.git 从远程下载所有分支到本地:git  fetch ...

  3. 联想扬天3900c电脑BIOS设置U盘启动图文教程

    有联想扬天3900c的用户反映说,制作好U大侠U盘后,按快捷键却识别不到U盘,不能进行U盘启动,这是怎么回事呢?其实这是BIOS设置的问题,下面U大侠教大家如何对联想扬天3900c电脑进行BIOS设置 ...

  4. tp框架增删改

    选择一张表: 首先要创建模型: 1 $n = M("account"); 数据库添加数据: 1.使用数组: 1 2 3 1.使用数组 $arr = array("uid& ...

  5. 使用powerpoint的表对象

    以下为basic范例,delphi使用需要加以修改 Table 对象 代表幻灯片上的表格形状.Table 对象是 Shapes 集合的成员.Table 对象包含 Columns 集合和 Rows 集合 ...

  6. PPIO 分布式存储在数据分发上有哪些优势?

    ​PPIO 是为开发者打造的去中心化存储与分发平台,让数据存储更便宜.更高速.更隐私.官方网站是 pp.io.PPIO 不仅仅是个存储平台,也是一个分发平台.之前我们写了许多文章介绍 PPIO 的存储 ...

  7. AD中批量创建域用户

    EXCEL表中的各列说明情况: A列:姓 B列:名 C列:姓名 D列:账号 E列:密码 此表格另存为person .csv 的格式到AD的C盘目录下,用记事本打开如下图所示: 打开CMD,右键以管理员 ...

  8. 知识点:tuple 元素真的不可变吗

    tuple 元素真的不可变吗 有一种有序列表叫元组:tuple. tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出单位或同学的名字: >>> clas ...

  9. Linux下Oracle开机启动

    参考:http://blog.csdn.net/huangyanlong/article/details/36942155 一.保证dbstart能用:vi $ORACLE_HOME/bin/dbst ...

  10. H5判断手机是否存在应用和打开应用

    伪命题,其实js无法判断您的手机是否存在此应用,遇到这样的需求我们应该跟ios和Android开发的同事商量,需要他们给你一个url尝试打开,如果能打开就表示手机中有该应用,如果不能打开就表示手机没有 ...