zoukankan      html  css  js  c++  java
  • [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 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    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 }
  • 相关阅读:
    Android Studio遇到了“No USB devices or running emulators detected”
    (转)Android Studio启动AVD遇到的问题 ( HAXM安装失败)
    (转)秒懂,Java 注解 (Annotation)你可以这样学 ---- 重要 注解定义与反射解析
    DSL简介(转)
    有什么软件可以让手机使用卫星通信吗?
    Openfire调整成自己的IM部署到LInux系统上
    cpu和gpu的区别
    (转)OpenFire源码学习之二十七:Smack源码解析
    (转)OpenFire源码学习之十八:IOS离线推送
    (转)openfire插件开发(三)通过http方式向openfire客户端发信息
  • 原文地址:https://www.cnblogs.com/strengthen/p/9872595.html
Copyright © 2011-2022 走看看