6 Z字形變換

2022-06-09 21:42:11 字數 1885 閱讀 2433

將乙個給定字串根據給定的行數,以從上往下、從左到右進行 z 字形排列。

比如輸入字串為 "leetcodeishiring" 行數為 3 時,排列如下:

l c i r

e t o e s i i g

e d h n

之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如:"lciretoesiigedhn"。

請你實現這個將字串進行指定行數變換的函式:

string convert(string s, int numrows);

示例 1:

輸入: s = "leetcodeishiring", numrows = 3

輸出: "lciretoesiigedhn"

示例 2:

輸入: s = "leetcodeishiring", numrows = 4

輸出: "ldreoeiiecihntsg"

直接將string放到乙個二維陣列中,然後按照要求輸出的順序輸出:

string convert(string s, int

numrows)

int length =s.length();

char** array = new

char*[numrows];

for (int ii = 0; ii < numrows; ii++)

}int index = 0

;

int i=0, j = 0;//

i表示行-numrows,j表示列-length

while (index else

}else

//正常情況的,i-- 然後j++

}//輸出

string result = ""

;

for (int j = 0; j < numrows; j++)//

行 }

}for (int ii = 0; ii < numrows; ii++)

return

result;

}

結果:記憶體、執行時間都很差,時間複雜度為o(n^2),且建立了乙個臨時的二維陣列,占用較多空間。

不用考慮字串放置時的空格,將string中的字元放到各個行對應的容器中,然後拼接結果即可。

思路通過從左向右迭代字串,我們可以輕鬆地確定字元位於 z 字形圖案中的哪一行。

演算法我們可以使用 min(numrows,len(s)) 個列表來表示 z 字形圖案中的非空行。

從左到右迭代 ss,將每個字元新增到合適的行。可以使用當前行和當前方向這兩個變數對合適的行進行跟蹤。

只有當我們向上移動到最上面的行或向下移動到最下面的行時,當前方向才會發生改變。

string convert(string s, int

numrows)

int row = min((int

)s.size(), numrows);

bool isgoingdown = false

;

int rowidx = 0

; vector

rowstrvec(row);

for (int i = 0; i < s.size(); i++)

rowstrvec[rowidx] +=s.at(i);

rowidx += (isgoingdown ? 1 : -1); //

如果到第一行,或者最後一行,改變方向

}

string

result;

for(auto str : rowstrvec)

return

result;

}

找輸入輸出字串中,特定位置的字元之間的關係,

6 Z字形變換

一 題目 將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r之後從左往右,逐行讀取字元 pahnaplsiigyir 實現乙個將字串進行指定行數變換的函式 string convert string s,int numrows 示例...

6 Z字形變換

將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r 之後從左往右,逐行讀取字元 pahnaplsiigyir 示例1 輸入 s paypalishiring numrows 3 輸出 pahnaplsiigyir 示例 2 輸入 s...

6 Z 字形變換

將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 l c i r e t o e s i i g e d h n之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如 lciretoesiigedh...