字符串算法题Z字行变换

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。

改题目主要是要发现对应的规律

主要的规律如下
1.起始下标都是行号
2.第0层和第numRows-1层的下标间距总是step 。
3.中间层的下标间距总是step-2行数,2行数交替。
4.下标不能超过len(s)-1

算法代码如下所示

#include<iostream>
#include<string>
#include<stdio.h>
#include<time.h>
using namespace std;
string convert(string s,int numRows){
    if(numRows==1)
        return s;
    int step=2*numRows-2;//间距
    int add=0;
    int len=s.length();
    string ret;
    for(int i=0;i<numRows;i++){
       int index=i;
        add=i*2;
        while(index<len){
            ret+=s[index];
            add=step-add;//来进行第中间行的分离
            index+=(i==0||i==numRows-1)?step:add;//最后一行跟第一行的setp总是等于sep的
        }
    }
    return ret;
}
int main(){
    string s;
    int numRows;
    cout<<"请输入字符串与对应的行数"<<endl;
    clock_t start,finish;
    start=clock();
    cin>>s>>numRows;
    string result=convert(s,numRows);
    cout<<result<<endl;
    finish=clock();
    cout<<"程序运行时间为"<<(double)finish-start/CLOCKS_PER_SEC<<endl;
}


第二种方法,感觉这种方法比第一种方法好想,但是时空复杂度比较高,代码如下

class Solution {
public:
    string convert(string s, int numRows) {

        if (numRows == 1) return s;

        vector<string> rows(min(numRows, int(s.size()))); // 防止s的长度小于行数
        int curRow = 0;
        bool goingDown = false;

        for (char c : s) {
            rows[curRow] += c;
            if (curRow == 0 || curRow == numRows - 1) {// 当前行curRow为0或numRows -1时,箭头发生反向转折
                goingDown = !goingDown;
            }
            curRow += goingDown ? 1 : -1;
        }

        string ret;
        for (string row : rows) {// 从上到下遍历行
            ret += row;
        }

        return ret;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,719评论 0 2
  • Z字形变换 将字符串"PAYPALISHIRING"以Z字形排列成给定的行数: P A H N A ...
    不爱去冒险的少年y阅读 3,142评论 0 0
  • 题目描述: 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETC...
    LeeYunFeng阅读 4,466评论 0 50
  • 早上起来晚了,六点二十起床,把早餐准备好看了会书就没出去跑步。早餐后带着爸爸和女儿一起去松岗公园跑了三公里,感谢爸...
    向日葵0601阅读 1,267评论 0 0
  • 玉米,就是我们常说的包谷,它是重要的粮食和饲料作物。玉米含有丰富的蛋白质,脂肪,维生素和其它物质,味道香甜,被誉为...
    小李说农事阅读 4,714评论 0 2