设为首页 加入收藏

TOP

#leetcode刷题之路6- Z 字形变换
2019-02-27 12:12:52 】 浏览:82
Tags:#leetcode 字形 变换

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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()详解和区别

 

 

 

 

 

 

 

 

 

 

 

 

 

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇#leetcode刷题之路8-字符串转换整.. 下一篇洛谷P4065 [JXOI2017]颜色(线段树)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目