算法 - 字符串01(Swift版本)

84 阅读1分钟

题目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()
}