Leetcode(C ) 6 Z 字形變換

2021-09-11 21:51:20 字數 1971 閱讀 4623

將乙個給定字串根據給定的行數,以從上往下、從左到右進行 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);
輸入: s = "leetcodeishiring", numrows = 3

輸出: "lciretoesiigedhn"

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

輸出: "ldreoeiiecihntsg"

解釋:l d r

e o e i i

e c i h n

t s g

方法一:逐字節讀取字串

假設原字串為「abcdefghijk」,擺成4行。

我們引入乙個陣列arr,陣列大小為4,接著遍歷字串,設i為字串的下標:

i = 0時,arr[0] = "a";

i = 1時,arr[1] = "b";

i = 2時,arr[2] = "c";

i = 3時,arr[3] = "d";

i = 4時,arr[2] = "ce";

i = 5時,arr[1] = "bf";

……i = 10時,arr[2] = "ceik";

接著逐行讀入arr陣列即可得到答案。

源程式:

class solution 

else

} string new_s = "";

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

return new_s;

}};

方法二:逐行讀入法

假設原字串為「abcdefghijk」,擺成4行。

思路:首先訪問行 0中的所有字元,接著訪問行 1,然後行 2,依此類推…:

設z字返回第一行前所有的數字為一組,該組數字數目為g_length = 2 * numrows -2;

行0、行numrows - 1:下標為i + g_length * t(t = 0,1,2...)

中間行:下標為i + g_length * t(t = 0,1,2...)和下標為i + g_length * t - 2 * i(t = 1,2...)

class solution {

public:

string convert(string s, int numrows) {

if(numrows == 1)

return s;

int s_length = s.length();

int g_length = 2 * numrows - 2;

string result = "";

for(int i = 0; i < numrows; i++) {

int j = i;

while(j < s_length) {

result += s[j];

j += g_length;

//cout<<"i: "<0 && i < numrows - 1 && j - i * 2 < s_length) {

//cout<<" "《題目相對挺簡單的,繼續coding!

LeetCode C 6 Z 字形變換

將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如 lciretoesiigedhn 請你實現這個將字串進行指定行數變換的函式 string c...

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...