LeetCode—6.ZigZag Conversion

Type:medium

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 = 3Output:"PAHNAPLSIIGYIR"

Example 2:

Input:s = "PAYPALISHIRING", numRows = 4Output:"PINALSIGYAHRPI"Explanation:P    I    NA  L S  I GY A  H RP    I


本题题意为输入一个数字和字符串,将字符串按照zigzag方式写成numRows行的新字符串,并按照从上至下从左到右的顺序输出该新字符串。

本题使用暴力做法,记录每个字符出现的位置,直接输出。

因此寻找位置表达方式:

P          A        H         N

A      P    L  S    I     I    G

         I         R

如图所示,设行数为n,可以将标记的2n-2个字符视为一次循环,size = 2n - 2。

设遍历时行数为i,则在输出第i行时,首先令j = i,输出s[j],接下来判断i是否为第0行或最后一行,若是的话直接输出s[j+size],将j+size赋为新的j值以此类推;若不是第0行或最后一行,则要首先输出s[j+size-2i],接下来再输出s[j+size]即可,然后同上,再次循环。将按顺序读取的所有的字符存在新的字符串中,并输出这个新的字符串。

本题难点在于在此环境中,c++语言无法直接push_back。因此直接开string ret,不能开大小,ret可以用ret += s[j]来赋值。


附代码:

class Solution {

public:

    string convert(string s, int numRows) {

        int n = s.length();

        if(numRows == 1) return s;

        int size = 2 * numRows - 2;

        string ret;

        for(int i=0; i

            for(int j=i; j

                ret += s[j];

                if(i != 0 && i != numRows-1){

                    int temp = j + size - 2 * i;

                    if(temp < n) ret += s[temp];

                }

            }

        }

        return ret;

    }

};

你可能感兴趣的:(LeetCode—6.ZigZag Conversion)