[Swift]LeetCode541. 反转字符串 II | Reverse String II

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

Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of them. If there are less than 2k but greater than or equal to k characters, then reverse the first k characters and left the other as original.

 Example:

Input: s = "abcdefg", k = 2
Output: "bacdfeg"

 Restrictions:

  1. The string consists of lower English letters only.
  2. Length of the given string and k will in the range [1, 10000]

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:

输入: s = "abcdefg", k = 2
输出: "bacdfeg"

要求:

  1. 该字符串只包含小写的英文字母。
  2. 给定字符串的长度和 k 在[1, 10000]范围内。

308ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3         var arr:[String] = [String]()
 4         //将字符串的字符存入数组中
 5         for char in s.characters
 6         {
 7             arr.append(String(char))
 8         }
 9         for i in stride(from: 0,to: s.count ,by: 2 * k)
10         {
11             var num:Int = min(i + k - 1,s.count - 1)
12             for (index, value) in arr[i...num].reversed().enumerated()
13             {
14                 arr[i + index] = value
15             }
16         }
17         //数组转换为字符串
18         return arr.reduce("", {$0 + $1})
19     }
20 }

32ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3         var arr = Array(s.characters)
 4         var index = 0
 5         
 6         while index < arr.count {
 7             reverse(&arr, index, min(index + k - 1, arr.count - 1))
 8             index += 2 * k
 9         }
10         return String(arr)
11     }
12     
13     func reverse(_ arr: inout [Character], _ startIndex: Int, _ endIndex: Int) {
14         var start = startIndex
15         var end = endIndex
16         while start <= (startIndex + endIndex) / 2 {
17             (arr[start], arr[end]) = (arr[end], arr[start])
18             start += 1
19             end -= 1
20         }
21     }
22 }

36ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3         if k == 0 {
 4             return s
 5         }
 6         let count = s.count
 7         let time = count/(2*k)
 8         let left = count%(2*k)
 9         
10         var array = [String]()
11         for i in 0..<time {
12             array.append(String(s.suffix(count-2*k*i).prefix(k*2)))
13         }
14         
15         var result = ""
16         for str in array {
17             result += String(str.prefix(k).reversed()+str.suffix(k))
18         }
19         
20         let leftStr = s.suffix(left)
21         let leftReversed = leftStr.prefix(k).reversed()
22         let leftUnreversed = leftStr.suffix(leftStr.count-leftReversed.count)
23         
24         result += leftReversed+leftUnreversed
25         return result
26     }
27 }

40ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3         var chars = s.map { $0 }
 4         
 5         var x = 0
 6         while x < chars.count {
 7             let rem = chars.count - x
 8             if rem >= 2*k {
 9                 var curr = x
10                 var max = x + k - 1
11                 for _ in 0..<k/2 {
12                     chars.swapAt(curr, max)
13                     curr += 1
14                     max -= 1
15                 }
16                 x += 2*k
17             } else if rem < k {
18                 var curr = x
19                 var max = chars.count-1
20                 for _ in 0..<rem/2 {
21                     chars.swapAt(curr, max)
22                     curr += 1
23                     max -= 1
24                 }
25                 break
26             } else {
27                 var curr = x
28                 var max = x + k - 1
29                 for _ in 0..<k/2 {
30                     chars.swapAt(curr, max)
31                     curr += 1
32                     max -= 1
33                 }
34                 break
35             }
36         }
37         
38         return String(chars)
39     }
40 }

80ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3         if s.count <= k { return String(s.reversed())}
 4         var array = s.map{ String($0) }
 5         var start = 0
 6         var i = 0
 7         while i < array.count {
 8             reverse(in: &array, from:i, to:i+k)
 9             i += 2*k
10         }
11         return array.reduce("", +)
12     }
13     
14     func reverse(in array: inout [String], from: Int, to: Int) {
15         var start = from
16         var end = min(to, array.count) - 1
17         while start < end {
18             let tmp = array[start]
19             array[start] = array[end]
20             array[end] = tmp
21             
22             start += 1
23             end -= 1
24         }
25     }
26 }

84ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3         var array = s.map{ String($0) }
 4         var start = 0
 5         var i = 0
 6         while i < array.count {
 7             reverse(in: &array, from:i, to:i+k)
 8             i += 2*k
 9         }
10         return array.reduce("", +)
11     }
12     
13     func reverse(in array: inout [String], from: Int, to: Int) {
14         var start = from
15         var end = min(to, array.count) - 1
16         while start < end {
17             let tmp = array[start]
18             array[start] = array[end]
19             array[end] = tmp
20             
21             start += 1
22             end -= 1
23         }
24     }
25 }

92ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3 
 4         var result = [String]()
 5         var array = s.map{ String($0) }
 6         var start = 0
 7         var i = 0
 8         while i < array.count {
 9             if i == start {
10                 var end = start+k >= array.count ? array.count : start+k
11                 var slice = array[start...end-1]
12                 result += Array(slice.reversed())
13                 start+=2*k
14             } else {
15                 result.append(contentsOf: array[i ..< min(i+k, array.count)])
16             }
17             i += k
18         }
19         return result.reduce("", +)
20     }
21 }

96ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3 
 4         var result = [String]()
 5         var array = s.map{ String($0) }
 6         var start = 0
 7         var i = 0
 8         while i < array.count {
 9             if i == start {
10                 var end = start+k >= array.count ? array.count : start+k
11                 var slice = array[start...end-1]
12                 result += Array(slice.reversed())
13                 start+=2*k
14             } else {
15                 var j = i
16                 while j<min(i+k, array.count) {
17                     result.append(array[j])
18                     j += 1
19                 }         
20             }
21             i += k
22         }
23         return result.reduce("", +)
24     }
25 }

100ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3         var array = s.map{ String($0) }
 4         var start = 0
 5         var i = 0
 6         while i < array.count {
 7             reverse(in: &array, from:i, to:i+k)
 8             i += 2*k
 9         }
10         return array.reduce("", +)
11     }
12     
13     func reverse(in array: inout [String], from: Int, to: Int) {
14         var start = from
15         var end = min(to, array.count) - 1
16         while start < end {
17             let tmp = array[start]
18             array[start] = array[end]
19             array[end] = tmp
20             
21             start += 1
22             end -= 1
23         }
24     }
25 }

116ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3         if k == 1 {
 4             return s
 5         }
 6         if s.count <= k {
 7             return String(s.reversed())
 8         }
 9         var chars = Array(s)
10         var i = 0
11         while i * k < s.count {
12             if i % 2 == 0 {
13                 if (i + 1) * k > s.count {
14                     let end = s.count - i * k - 1
15                     for ii in 0 ... (end / 2) {
16                         let left = i * k + ii
17                         let right = i * k + end - ii
18                         let tmp = chars[left]
19                         chars[left] = chars[right]
20                         chars[right] = tmp
21                     }
22                 } else {
23                     for ii in 0 ... (k / 2 - 1) {
24                         let left = i * k + ii
25                         let right = i * k + k - ii - 1
26                         let tmp = chars[left]
27                         chars[left] = chars[right]
28                         chars[right] = tmp
29                     }
30                 }
31                 
32             }
33             i += 1
34         }
35         return String(chars)
36     }
37 }

136ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3 
 4         var result = [String]()
 5         var array = s.map{ String($0) }
 6         var start = 0
 7         var i = 0
 8         while i < array.count {
 9             if i == start {
10                 var end = start+k >= array.count ? array.count : start+k
11                 var slice = array[start...end-1]
12                 result += Array(slice.reversed())
13                 start+=2*k
14             } else {
15                 result.append(contentsOf: array[i ..< min(i+k, array.count)])
16             }
17             i += k
18         }
19         return result.reduce("", +)
20     }
21 }

256ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3         var reverseIndex = true
 4         var index = 0
 5         var newStr = ""
 6         while(index < s.count - k) {
 7             let range = s.index(s.startIndex, offsetBy: index)..<s.index(s.startIndex, offsetBy: index + k)
 8             let substr = String(s[range])
 9             newStr += reverseIndex ? reverse(substr) : substr
10             
11             reverseIndex = !reverseIndex
12             index += k
13         }
14         
15         let range = s.index(s.startIndex, offsetBy: index)..<s.endIndex
16             let substr = String(s[range])
17             newStr += reverseIndex ? reverse(substr) : substr
18         
19         return newStr
20     }
21     
22     func reverse(_ str: String) -> String {
23         var strArr = Array(str)
24         let count = strArr.count
25         guard count > 1 else { return str }
26         var index = 0
27         while(index < count / 2) {
28             let temp = strArr[count - 1 - index]
29             strArr[count - 1 - index] = strArr[index]
30             strArr[index] = temp
31             index += 1
32         }
33         return strArr.map { String(describing: $0) }.joined()
34         
35         
36     }
37 }

 296ms

 1 class Solution {
 2     func reverseStr(_ s: String, _ k: Int) -> String {
 3        var str = Array(s)
 4         var i = 0
 5         while(i < s.count) {
 6             var start = i, end = min(i + k, s.count) - 1
 7             while(start < end) {
 8                 let temp = str[end]
 9                 str[end] = str[start]
10                 str[start] = temp
11                 start += 1
12                 end -= 1
13             }
14             i += 2 * k
15         }
16         return str.map{ String(describing: $0)}.joined()
17     }
18 }

 

转载于:https://www.cnblogs.com/strengthen/p/9839292.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用reverse函数反转leetcode字符串的方法是:将字符串作为参数传入reverse函数,然后将反转后的字符串返回给调用者。例如:let reversedString = reverse("leetcode")。 ### 回答2: 要使用reverse函数反转leetcode这个字符串,可以使用以下步骤: 1. 将字符串"leetcode"转换为字符数组。可以使用字符串的toCharArray()方法,该方法会返回一个字符数组,其中每个元素是字符串的一个字符。 2. 定义两个指针,left和right,分别指向字符数组的首尾。 3. 循环交换left和right指向的字符,然后将left指针向右移动一位,将right指针向左移动一位,直到left指针大于等于right指针。 4. 将反转后的字符数组转换回字符串。可以使用字符数组的valueOf()方法,该方法会将字符数组转换为一个新的字符串。 以下是用Java代码实现上述步骤的示例: ```java public String reverseString(String s) { // 将字符串转换为字符数组 char[] chars = s.toCharArray(); // 定义两个指针 int left = 0; int right = chars.length - 1; // 循环交换字符 while (left < right) { char temp = chars[left]; chars[left] = chars[right]; chars[right] = temp; left++; right--; } // 将字符数组转换为字符串 return String.valueOf(chars); } ``` 通过调用reverseString("leetcode")函数,将会返回字符串"edocteel",即将"leetcode"反转的结果。 ### 回答3: 要使用reverse函数来反转字符串"leetcode",只需将字符串转换为一个列表,然后使用reverse函数来翻转该列表,最后将列表转回字符串即可。 首先,将字符串"leetcode"转换为一个字符列表,可以使用list函数来实现,即list("leetcode"),得到列表['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']。 接下来,使用reverse函数来反转该列表,即reverse(['l', 'e', 'e', 't', 'c', 'o', 'd', 'e'])。 最后,将翻转后的列表转换回字符串,可以使用join函数将列表中的字符连接起来,即''.join(['e', 'd', 'o', 'c', 't', 'e', 'e', 'l'])。 所以,将字符列表['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']翻转并转换为字符串的过程为:''.join(reverse(list("leetcode"))),得到的结果为"edocteel",即字符串"leetcode"反转后的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值