题目描述:

 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:
P   A   H   N
A P L S I I G
Y I R

之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

实现一个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"

示例 2:

输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释: P I N
A L S I G
Y A H R
P I

要完成的函数:

string convert(string s, int numRows)

说明:

1、这道题给定一个字符串s和行数,要求将字符串按z字形排列,具体见“题目描述”中举的例子。

排列完之后,再按行读取,最后输出新的字符串结果。

2、这道题感觉比easy题难一点点,但是比上次做的琐碎无比的medium好得不要太多!

这道题我们只要明白规律就可以了,不用真的去把字符串排列成z字形存储起来,再按行读取的~

举个例子,比如,s = "PAYPALISHIRING", numRows = 4

P     I    N
A L S I G
Y A H R
P I

当行数为4时,我们可以看到每座“山”(从P到L)有6个元素,而我们一共有3座“山”。

所以我们需要的是字符串中第0个元素,第6个元素,第12个元素。(不断加6)

以及第二行的字符串中第1个元素,第5个元素,第7个元素,第11个元素,第13个元素。(加4加2,再重复)

以及第三行的字符串中第2个元素,第4个元素,第8个元素,第10个元素。(加2加4,再重复)

以及第四行的字符串中第3个元素,第9个元素。(不断加6)

我们可以发现什么规律?

我们可以根据numRows和字符串s的长度,知道有几座“山”,知道每座“山”的元素个数。

进而可以根据每座山的元素个数,得到字符串中的坐标。

比如上述例子中,每座山的元素个数是6,所以字符串中的坐标是0,6,12(不能超出字符串的长度)

接着,我们从第二行的1开始,这时候要加4,再加6-4=2,不断地加,得到坐标是1,5,7,11,13(不能超出字符串的长度)

再接着,从第三行的2开始,这时候要加2,再加6-2=4,不断地加……

最后,从最后一行的3开始,这时候要加6-0=6,不断地加……

如此这般,便可得到新的字符串,代码如下:(附详解)

    string convert(string s, int numRows)
{
if(numRows==1)//边界情况,如果只有1行,那么直接返回原本的字符串
return s;
int s1=s.size(),s2=2*numRows-2,s3=s2,index=0,index1,count=0;//s2表示山峰的元素个数
string res=s;
for(int i=0;i<numRows;i++)//逐行处理
{
index1=index;//记录一下index的值,最开始为0,接着是1,再接着是2……
while(index<s1)//每一行中只要坐标index不超过字符串的长度,那么不断处理
{
if(s3==s2)//如果是第一行
{
res[count]=s[index];
index+=s3;
count++;
}
else if(s3==0)//如果是最后一行
{
res[count]=s[index];
index+=(s2-s3);
count++;
}
else//如果是中间行
{
res[count]=s[index];
index+=s3;
count++;
if(index<s1)//不能超过字符串的长度
{
res[count]=s[index];
index+=(s2-s3);
count++;
   }
}
}
s3-=2;//处理完一行之后,s3减去2
index=index1+1;//更新index的值
}
return res;//最后返回新的字符串
}

上述代码实测16ms,beats 95.97% of cpp submissions。

leetcode-6-Z字形变换的更多相关文章

  1. C#版[击败100.00%的提交] - Leetcode 6. Z字形变换 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  2. Java实现 LeetCode 6 Z字形变换

    6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  3. [LeetCode] 6. Z 字形变换

    题目链接:(https://leetcode-cn.com/problems/zigzag-conversion/) 题目描述: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列 ...

  4. LeetCode 6. Z字形变换(ZigZag Conversion)

    题目描述 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:"P ...

  5. Leetcode(6)Z字形变换

    Leetcode(6)Z字形变换 [题目表述]: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...

  6. Leetcode题库——6.Z字形变换

    @author: ZZQ @software: PyCharm @file: convert.py @time: 2018/9/20 20:12 要求: Z字形变换 将字符串 "PAYPAL ...

  7. LeetCode Golang 6. Z 字形变换

    6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  8. Z 字形变换 C++实现 java实现 leetcode系列(六)

    Z 字形变换  java实现 C++实现  将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 ...

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

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

  10. leetcode刷题六<z字形变换>

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 时,排列如下: L C I R E T O E S I I G E D H N 之后,你的输出需要从左往右逐 ...

随机推荐

  1. mybatis与hibernate不同(重要)

    Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象 ...

  2. 利率计算v4.0--测试--软件工程

    利率计算v4.0--测试 package Test; import Model.Interest; import Service.CompoundInterestService; import Ser ...

  3. PHP开启页面报错的代码

    PHP开启页面报错的方法很简单,在<?php内加入下面的代码就可以了: <?php ini_set("display_errors", "On"); ...

  4. CentOS 最新版的下载地址 + 版本选择详解

    CentOS 最新版的下载地址 + 版本选择详解 发现越来越多的机关单位.事业单位开始使用 Linux 作为主要服务器,毕竟,Linux的稳定性和高效性是众所周知的,所以我也打算把自己这一块技术加强一 ...

  5. deploy: [mkdir] Created dir: C:\Program Files\Java\apache-cxf-2.4.2\samples\java_first_pojo\build [loadfile] Do not set property srcbuild.classpath as its length is 0.

    使用CXF的错误,错误是说我的路径有错误,因为路径错误所以无法运行程序 (1)原因,我将其放入了Program Files文件夹下,所以,其不好使 分析原因: 目录路径错误,目录中不能有空格,否则其解 ...

  6. loadrunner - 安装与破解

    最近准备学习LR,借助这个平台,将自己的学习经历记录下来,当然很多都不是原创,都是遇到问题时各种百度,然后梳理下知识是为了避免以后遇到同样的错误时,能回过头来参考参考. 下面的是转载某位大神的博客,尊 ...

  7. EBS-BG&LE&OU

    SELECT DISTINCT hrl.country,                hroutl_bg.NAME            bg,                hroutl_bg.o ...

  8. Android-自定义开关(升级版)

    效果图: 定义一个类,取名为MySwitch.java,此类去继承View,为何是继承View而不是去继承ViewGroup呢,是因为自定义开关没有子控件,之需要操作自身绘制即可 package cu ...

  9. AndroidStudio-Error Loading Project: Cannot load 3 facets

    Error Loading Project: Cannot load 3 facets 解决方法,在 File-->Settings-->Plugins-----> 勾选 Andro ...

  10. Hadoop 集群配置记录小结

    Hadoop集群配置往往按照网上教程就可以"配置成功",但是你自己在操作的时候会有很多奇奇怪怪的问题出现, 我在这里整理了一下常见的问题与处理方法: 1.配置/etc/hosts ...