计蒜客 “之”型路线 (字符串)

字符串“PAYPALISHIRING”的一种“之”字型路线是这样的:

如果一行一行的读写,就是PAHNAPLSIIGYIR。

请写一个函数如下:string convert(string text, int nRows);

当输入convert("PAYPALISHIRING", 3)的时候,返回的结果是PAHNAPLSIIGYIR。

如果你还不了解,我告诉你,这就是一个字符串的转换问题,设置成之字形的路线。

zigzag conversion也就是按"N"字母的样子来重新安排字符串中字符的位置,并合并成一个新的字符串。nRows则表示"N"的高度,也就是每一竖列有nRows个字符。

输入格式:第一行输入一个长度不超过250的字符串text和一个整数nRows,中间空格间隔。

输出格式:输出一行字符串,表示最终结果。

样例输入

ABCDEFG 4

样例输出

AGBFCED

这道题,初一看是很难,仔细研究一下,找到其中的规律就不难写出答案,如图

可以看出,行数的变化是有规律的,如果高度为n,则每2n-2个字母行数为一组,另起一个数组来存相对应字符的行数,然后按行数打印出来即可,代码如下:

#include<iostream>
using namespace std;
void convert(string text, int nRows)
{
    int a[300];
    if(nRows == 1)
        cout << text;
    else
    {
        int n = text.length();
        for(int i = 0;i < n; i++)
        {
            a[i] = (i + 1) % (2 * nRows - 2);
            if(!a[i])   a[i] = 2 * nRows - 2;
            if(a[i] > nRows)
            {
                int c = a[i] - nRows;
                a[i] = nRows - c;
            }
        }
        int hang = 0;
        while(hang++ <= nRows)
        {
            for(int i = 0;i < n; i++)
            {
                if(a[i] == hang)
                    cout << text[i];
            }
        }
    }
}
int main()
{
    string text;
    int nRows;
    cin >> text >> nRows;
    convert(text,nRows);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiao__hei__hei/article/details/81540080
今日推荐