zigzag conversion

leetcode

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
class Solution {
public:
    string convert(string s, int numRows) {
    if(numRows == 1) return s;
    if(numRows >= s.length()) return s;
    char t[s.length() + 1] = {0};
    int j = 0, index = 0;
    while(j < numRows){
        if(j == 0){// the first line
            for(int i = 0; 2*i * (numRows - 1) < s.length(); i++){
                t[index++] = s[2 * i * (numRows - 1)];
            }
        }
        else if(j == numRows - 1){// the last line
            for(int i = 0; (2 * i + 1) * (numRows - 1) < s.length(); i++){
                t[index++] = s[(2 * i + 1) * (numRows - 1)];
            }
        }
        else{
            for(int i = 0; (2 * i * (numRows -1) - j) < s.length() || (2 * i * (numRows -1) + j) < s.length(); i++){
                if(((2 * i) * (numRows -1) - j) < s.length() && ((2 * i) * (numRows -1) - j) >= 0){
                    t[index++] = s[(2 * i) * (numRows -1) - j];
                }
                if(s[2 * i * (numRows -1) + j] != '\0' && (2 * i * (numRows -1) + j) < s.length()){
                    t[index++] = s[2 * i * (numRows -1) + j];
                }
            }
        }
        j++;
    }
    return string(t);
    }
};

傻瓜方法的思路是创建一个结果字符串,和输入字符串一样长。然后根据输入字符串以及行数(numRows)来填充结果字符串。用变量j来处理每一行,画成之字型之后的每一行。第一行和最后一行单独处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Memories off

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值