將乙個給定字串根據給定的行數,以從上往下、從左到右進行 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, intnumrows)
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, intnumrows)
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...