为有牺牲多壮志,敢教日月换新天。

[Swift]LeetCode6. Z字形变换 | ZigZag Conversion

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9872595.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

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)

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

And then read line by line: "PAHNAPLSIIGYIR"

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:

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

Example 2:

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"

实现一个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入: 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 }

 

posted @ 2018-10-29 19:14  为敢技术  阅读(528)  评论(0编辑  收藏  举报