第一周:[LeetCode]6. ZigZag Conversion

本文介绍了一种特殊的字符串转换方式——ZigZag转换,该转换方式将字符串以Z字形排列并按行读取。文章提供了一个C++实现方案,通过计算字符串在不同行之间的跳跃规律来完成转换。

[LeetCode]6. ZigZag Conversion

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 text, int nRows);
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.


寻找数学规律,类似于将字符串按照蛇形的顺序读,然后按照正常的顺序输出,读取时每次的步长大小为2*(numRows-1),且还需注意,若不是首尾两行,每次跳步中有与其对称的点。时间复杂度是O(n)

class Solution {
public:
    string convert(string s, int numRows) {
        if(s.length()<numRows||numRows<2)
            return s;
        string result = s;
        int steplength = 2*(numRows-1),k=0;
        for(int i=0;i<numRows;i++){
            for(int j=i;j<s.length();j+=steplength){
                result[k++]=s[j];
                if((i!=0)&&(i!=numRows-1)&&(j+steplength-2*i<s.length()))
                    result[k++]=s[j+steplength-2*i];
            }
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值