题目1: 344.反转字符串
// @lc code=start
class Solution {
func reverseString(_ s: inout [Character]) {
for i in 0..<s.count {
let right = s.count - 1 - i
if right <= i {
break
}
let temp = s[i]
s[i] = s[right]
s[right] = temp
}
}
}
// @lc code=end
题解的swift写法也值得借鉴,使用元祖交换可以实现类似python一样的交换写法
// 双指针 - 元组
func reverseString(_ s: inout [Character]) {
var l = 0
var r = s.count - 1
while l < r {
// 使用元祖
(s[l], s[r]) = (s[r], s[l])
l += 1
r -= 1
}
}
题目2:541. 反转字符串II
自己没AC,值得再次复习一下。
主要是选择了步进k,导致要处理的情况过多, 这里按照题目的要求 进行2*k的步进就可以
哈哈,我就是下面这些同学。
一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。
其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。
class Solution {
func reverseStr(_ s: String, _ k: Int) -> String {
var chars = Array(s)
for i in stride(from: 0, to: s.count, by: 2 * k) {
var left = i
var right = min(i + k - 1, s.count - 1)
while left < right {
(chars[left], chars[right]) = (chars[right], chars[left])
left += 1
right -= 1
}
}
return String(chars)
}
}
题目3: 替换数字
func replaceNumber(_ s: String) -> String {
var chars = [String]()
for char in Array(s) {
let val = char.unicodeScalars.first!.value
if val >= "0".unicodeScalars.first!.value, val <= "9".unicodeScalars.first!.value {
chars.append("number")
} else {
chars.append(String(char))
}
}
return chars.joined()
}