字符串算法題Z字行變換

將一個(gè)給定字符串根據(jù)給定的行數(shù),以從上往下、從左到右進(jìn)行 Z 字形排列。

比如輸入字符串為 "LEETCODEISHIRING" 行數(shù)為 3 時(shí),排列如下:

L C I R
E T O E S I I G
E D H N
之后,你的輸出需要從左往右逐行讀取,產(chǎn)生出一個(gè)新的字符串,比如:"LCIRETOESIIGEDHN"。

改題目主要是要發(fā)現(xiàn)對(duì)應(yīng)的規(guī)律

主要的規(guī)律如下
1.起始下標(biāo)都是行號(hào)
2.第0層和第numRows-1層的下標(biāo)間距總是step 。
3.中間層的下標(biāo)間距總是step-2行數(shù),2行數(shù)交替。
4.下標(biāo)不能超過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;//來進(jìn)行第中間行的分離
            index+=(i==0||i==numRows-1)?step:add;//最后一行跟第一行的setp總是等于sep的
        }
    }
    return ret;
}
int main(){
    string s;
    int numRows;
    cout<<"請(qǐng)輸入字符串與對(duì)應(yīng)的行數(shù)"<<endl;
    clock_t start,finish;
    start=clock();
    cin>>s>>numRows;
    string result=convert(s,numRows);
    cout<<result<<endl;
    finish=clock();
    cout<<"程序運(yùn)行時(shí)間為"<<(double)finish-start/CLOCKS_PER_SEC<<endl;
}


第二種方法,感覺這種方法比第一種方法好想,但是時(shí)空復(fù)雜度比較高,代碼如下

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

        if (numRows == 1) return s;

        vector<string> rows(min(numRows, int(s.size()))); // 防止s的長(zhǎng)度小于行數(shù)
        int curRow = 0;
        bool goingDown = false;

        for (char c : s) {
            rows[curRow] += c;
            if (curRow == 0 || curRow == numRows - 1) {// 當(dāng)前行curRow為0或numRows -1時(shí),箭頭發(fā)生反向轉(zhuǎn)折
                goingDown = !goingDown;
            }
            curRow += goingDown ? 1 : -1;
        }

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

        return ret;
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,044評(píng)論 0 2
  • Z字形變換 將字符串"PAYPALISHIRING"以Z字形排列成給定的行數(shù): P A H N A ...
    不愛去冒險(xiǎn)的少年y閱讀 471評(píng)論 0 0
  • 題目描述: 將一個(gè)給定字符串根據(jù)給定的行數(shù),以從上往下、從左到右進(jìn)行 Z 字形排列。比如輸入字符串為 "LEETC...
    LeeYunFeng閱讀 996評(píng)論 0 50
  • 早上起來晚了,六點(diǎn)二十起床,把早餐準(zhǔn)備好看了會(huì)書就沒出去跑步。早餐后帶著爸爸和女兒一起去松崗公園跑了三公里,感謝爸...
    向日葵0601閱讀 203評(píng)論 0 0
  • 玉米,就是我們常說的包谷,它是重要的糧食和飼料作物。玉米含有豐富的蛋白質(zhì),脂肪,維生素和其它物質(zhì),味道香甜,被譽(yù)為...
    小李說農(nóng)事閱讀 1,211評(píng)論 0 2

友情鏈接更多精彩內(nèi)容