[Swift]LeetCode6. Z字形變換 | ZigZag Conversion

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-qoomoifs-me.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)git

P   A   H   N
A P L S I I G
Y   I   R

And then read line by line: "PAHNAPLSIIGYIR"github

Write the code that will take a string and make this conversion given a number of rows:微信

string convert(string s, int numRows);

Example 1:app

Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"

Example 2:ide

Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P     I    N
A   L S  I G
Y A   H R
P     I

將字符串 "PAYPALISHIRING" 以Z字形排列成給定的行數:函數

P   A   H   N
A P L S I I G
Y   I   R

以後從左往右,逐行讀取字符:"PAHNAPLSIIGYIR"this

實現一個將字符串進行指定行數變換的函數:spa

string convert(string s, int numRows);

示例 1:code

輸入: s = "PAYPALISHIRING", numRows = 3
輸出: "PAHNAPLSIIGYIR"

示例 2:

輸入: s = "PAYPALISHIRING", numRows = 4
輸出: "PINALSIGYAHRPI"
解釋:
P     I    N
A   L S  I G
Y A   H R
P     I

44ms
 1 class Solution {
 2     func convert(_ s: String, _ numRows: Int) -> String {
 3         guard numRows > 1 else { return s }
 4         let characters = Array(s)
 5         let interval = 2 * (numRows - 1)
 6         
 7         var result = [Character]()
 8         var i = 0, offset = 0, pos = 0
 9         
10         while offset < numRows {
11             i = 0
12             while true {
13                 pos = interval * i + offset
14                 guard pos < characters.count else { break }
15                 result.append(characters[pos])
16                 
17                 if offset > 0 && offset < numRows - 1 {
18                     pos = interval * (i + 1) - offset
19                     guard pos < characters.count else { break }
20                     result.append(characters[pos])
21                 }
22                 
23                 i += 1
24             }
25             
26             offset += 1
27         }
28         
29         return String(result)
30     }
31 }

48ms

 1 class Solution {
 2     func convert(_ s: String, _ numRows: Int) -> String {
 3         if numRows == 1 {
 4             return s
 5         }
 6         var stringArray: Array<Character> = Array(s)
 7         
 8         var answerArray: Array<String> = Array(repeating: String(), count: numRows)
 9         var flag: Int = 0
10         var currentRow: Int = 0
11         var answer: String = String()
12         for i in 0..<stringArray.count {
13             if (flag + i) % numRows == 0 {
14                 flag += 1
15             }
16             answerArray[currentRow].append(stringArray[i])
17             if flag % 2 == 0 {
18                 currentRow -= 1
19             } else {
20                 currentRow += 1
21             }
22         }
23         for str in answerArray {
24              answer += str
25         }
26         return answer
27     }
28 }

52ms

 1 class Solution {
 2     func convert(_ s: String, _ numRows: Int) -> String {
 3         if numRows == 1 || numRows >= s.count {
 4             return s
 5         }
 6         var stringArray: Array<Character> = Array(s)
 7         
 8         var answerArray: Array<String> = Array(repeating: String(), count: numRows)
 9         var flag: Int = 0
10         var currentRow: Int = 0
11         var answer: String = String()
12         for i in 0..<stringArray.count {
13             if (flag + i) % numRows == 0 {
14                 flag += 1
15             }
16             answerArray[currentRow].append(stringArray[i])
17             currentRow = currentRow + 2 * (flag % 2) - 1
18         }
19         for str in answerArray {
20              answer += str
21         }
22         return answer
23     }
24 }

64ms

 1 class Solution {
 2     func convert(_ s: String, _ numRows: Int) -> String {
 3         if numRows == 1 {
 4             return s
 5         }
 6         var stringArray: Array<Character> = Array(s)
 7         var answerArray: Array<String> = Array(repeating: String(), count: numRows)
 8         var flag: Int = 0
 9         var currentRow: Int = 0
10         var answer: String = String()
11         for i in 0..<stringArray.count {
12             if (flag + i) % numRows == 0 {
13                 flag += 1
14             }
15             answerArray[currentRow].append(stringArray[i])
16             if flag % 2 == 0 {
17                 currentRow -= 1
18             } else {
19                 currentRow += 1
20             }
21         }
22         return answerArray.joined()
23     }
24 }

76ms

 1 class Solution {
 2     func convert(_ s: String, _ numRows: Int) -> String {
 3         guard numRows > 1 else {
 4             return s
 5         }
 6         var result = ""
 7         let arr = s.map {$0}
 8         let interval = (numRows-1)*2
 9         for rowIndex in 0..<numRows {
10             for index in stride(from: rowIndex, to: arr.count, by: interval) {
11                 result.append(arr[index])
12                 if rowIndex > 0 && rowIndex < numRows - 1 {
13                     let next = index + (interval - 2*rowIndex)
14                     if next < arr.count {
15                         result.append(arr[next])
16                     }
17                 }
18             }
19         }
20         return result
21     }
22 }

80ms

 1 class Solution {
 2     func convert(_ s: String, _ numRows: Int) -> String {
 3         if numRows == 1 {
 4             return s
 5         }
 6 
 7         let chars = s.utf8CString
 8         var result = [CChar]()
 9         let count = chars.count - 1
10         let cycle = 2 * numRows - 2
11         for i in 0..<numRows {
12             var j = 0
13             while i + j < count {
14                 defer {
15                     j += cycle
16                 }
17 
18                 result.append(chars[i + j]);
19                 if i != 0 && i != numRows - 1
20                     && j + cycle - i < count {
21                     result.append(chars[j + cycle - i])
22                 }
23             }
24         }
25         result.append(0)
26         return String(cString: result)
27     }
28 }

88ms

 1 class Solution {
 2 func convert(_ s: String, _ numRows: Int) -> String {
 3   var chars = Array(s)
 4   var result = ""
 5 
 6   let groupCount = max(1, (numRows - 1) * 2)
 7 
 8   for r in 0..<numRows {
 9     var current = r
10     var skip = (numRows - r - 1) * 2
11     if skip == 0 {
12       skip = groupCount
13     }
14     while current < chars.count {
15       result.append(chars[current])
16       current += skip
17       skip = groupCount - skip
18       if skip == 0 {
19         skip = groupCount
20       }
21     }
22   }
23   return result
24 }
25 }

96ms

 1 class Solution {
 2     func convert(_ s: String, _ numRows: Int) -> String {
 3          if s == "" { return "" }
 4         if numRows == 1 { return s}
 5         
 6         var output = Array(s)
 7         let array = Array(s)
 8         let len = array.count
 9         var row = numRows
10         var k=0
11         
12         for j in 0..<numRows {
13             let cycle1 = numRows - j - 1
14             let cycle2 = numRows - row
15             var i = j
16             
17             while i < len {
18                 if cycle1 > 0, i < len {
19                     output[k] = array[i]
20                     k = k + 1
21                     i = i + cycle1 + cycle1
22                 }
23                 if cycle2 > 0, i < len {
24                     output[k] = array[i]
25                     k = k + 1
26                     i = i + cycle2 + cycle2
27                 }
28             }
29             row = row - 1
30         }
31         return String(output)
32     }
33 }

100ms

 1 class Solution {
 2     func convert(_ s: String, _ numRows: Int) -> String {
 3         if numRows == 1 {return s}
 4         var ret:String = String()
 5         var n:Int = s.count
 6         var cycleLen = 2 * numRows - 2
 7         
 8         for i in 0..<numRows
 9         {
10             var j:Int = 0
11             while( j + i < n)
12             {
13                 ret.append(s[s.index(s.startIndex, offsetBy:j + i)])
14                 if i != 0 && i != numRows - 1 && j + cycleLen - i < n
15                 {
16                     ret.append(s[s.index(s.startIndex, offsetBy:j + cycleLen - i)])
17                 }
18                 //注意應放在語句最後
19                 j += cycleLen
20             }
21         }
22          return String(ret)
23     }
24 }
相關文章
相關標籤/搜索