將一個(gè)給定字符串根據(jù)給定的行數(shù)穷遂,以從上往下晌畅、從左到右進(jìn)行 Z 字形排列玉组。
比如輸入字符串為 "LEETCODEISHIRING" 行數(shù)為 3 時(shí)敏储,排列如下:
屏幕快照 2019-01-22 下午3.24.57.png
之后阻星,你的輸出需要從左往右逐行讀取,產(chǎn)生出一個(gè)新的字符串已添,比如:"LCIRETOESIIGEDHN"妥箕。
請(qǐng)你實(shí)現(xiàn)這個(gè)將字符串進(jìn)行指定行數(shù)變換的函數(shù):
string convert(string s, int numRows);
示例 1:
輸入: s = "LEETCODEISHIRING", numRows = 3
輸出: "LCIRETOESIIGEDHN"
示例 2:
輸入: s = "LEETCODEISHIRING", numRows = 4
輸出: "LDREOEIIECIHNTSG"
解釋:
屏幕快照 2019-01-22 下午3.25.28.png
解法:首先訪問(wèn) 行 0 中的所有字符,接著訪問(wèn) 行 1更舞,然后 行 2畦幢,依此類推...對(duì)于所有整數(shù) k,
- 行 0 中的字符位于索引 k(2?numRows?2)處;
- 行 numRows?1 中的字符位于索引 k(2?numRows?2)+numRows?1 處;
- 內(nèi)部的行 i 中的字符位于索引 k(2?numRows?2)+i 以及 (k+1)(2?numRows?2)?i 處;
guard numRows > 1 else {
return s
}
var newStr : String = ""
var array = Array(s)
let n = s.count
let cycleLen = 2 * numRows - 2
for i in 0..<numRows{
var j = 0
while j + i < n{
newStr.append(array[j + i])
if i != 0 && i != numRows - 1 && j + cycleLen - i < n{
newStr.append(array[j + cycleLen - i])
}
j += cycleLen
}
}
return newStr