《剑指Offer》阅读笔记(swift):字符串(8题)

524 阅读2分钟

我的Github地址

小码哥《恋上数据结构与算法》笔记

极客时间《iOS开发高手课》笔记

iOS大厂面试高频算法题总结

iOS面试资料汇总

  • 字符串(8道):
    • 剑指Offer (5):替换空格
    • 剑指Offer(19):正则表达式匹配
    • 剑指Offer(20):表示数值的字符串
    • 剑指Offer(38):字符串的排列
    • 剑指Offer(50):第一个只出现一次的字符
    • 剑指Offer(58):翻转单词顺序序列
    • 剑指Offer(58):左旋转字符串
    • 剑指Offer(67):把字符串转换成整数

面试题5:替换空格

题目一

思路一

思路二

代码

func replaceSpace(_ s: String) -> String {
    guard s.count > 0 else { return "" }
    
    var chars = Array(s)
    var count = 0
    var oldEnd = chars.count - 1

    // 计算空格数
    for char in chars {
        if char == " " { count += 1 }
    }
    // 计算扩容数量
    var newCount = count * 2 + chars.count
    // 扩容
    for i in 0..<count * 2 { chars.append(" ") }
    // 从后往前替换
    var newEnd = chars.count - 1
    while newEnd >= 0 && oldEnd >= 0 {

        if chars[oldEnd] != " " {
            chars[newEnd] = chars[oldEnd]
        } else {
            chars[newEnd] = "0"
            chars[newEnd - 1] = "2"
            chars[newEnd - 2] = "%"
            newEnd -= 2
        }
        newEnd -= 1
        oldEnd -= 1
    }
    return String(chars)
}

面试题19:正则表达式匹配

题目一

面试题20:表示数值的字符串

题目一

面试题50:第一个只出现一次的字符

题目一

思路一

    func firstUniqChar(_ s: String) -> Character {
        var dict = [Character:Int]()
        for i in s {
            if let v = dict[i] {
                dict[i] = v + 1
            } else {
                dict[i] = 1
            }
        }
        for i in s {
            if let v = dict[i] {
                if v == 1 {
                    return i
                }
            }
        }
        return " "
    }

面试题58:翻转字符串

题目一

思路一

代码

    func reverseWords(_ s: String) -> String {
        if s.count == 0 {
            return s
        }
        var trs = [Character](trimAndExtrusionWhitespaces(s)).reversed() as [Character]
        var start = 0, end = 0
        while start < trs.count {
            while end < trs.count && trs[end] != " " {
                end += 1
            }
            reversed(&trs, l: start, r: end - 1)
            end += 1
            start = end
        }
        return String(trs)
    }

    func reversed(_ s: inout [Character], l: Int, r: Int) {
        var i = l, j = r
        while i < j {
            s.swapAt(i, j)
            i += 1
            j -= 1
        }
    }

    //去掉收尾空格并把中间多个空格合并为一个空格
    func trimAndExtrusionWhitespaces(_ s: String) -> String {
        return s.trimmingCharacters(in: .whitespaces).components(separatedBy: .whitespaces).filter { $0 != "" }.joined(separator: " ")
    }

思路二:swift高阶函数

代码

    func reverseWords(_ s: String) -> String {
        return s.split(separator: " ")
                .reversed()
                .joined(separator: " ")
    }

思路三:数组

代码

func reverseWords(_ s: String) -> String {
    
    var word = [Character]() // 装填每个字母
    var words = [[Character]]() // 装填每个单词

    for item in s {
        // 略过多余空格
        if item == " " && word.count == 0 {
            continue
        }
        // 装填一次单词
        else if item == " " && word.count != 0{
            words.append(word)
            word.removeAll()
        }
        
        // 添加单词
        else {
            word.append(item)
        }
    }
    // 添加最后一个单词
    if word.count != 0 { words.append(word) }
    
    var str = ""
    let count = words.count
    while words.count != 0 {
        // 非第一个单词,添加一个空格
        if words.count != count {str.append(" ")}
        // 倒叙添加单词
        str = str + words.popLast()!
    }
    
    return str
}

题目二

思路一

代码

    func reverseLeftWords(_ s: String, _ n: Int) -> String {
        if s.isEmpty || n == 0 {
            return s
        }
        var chs = [Character](s)
        let end = chs.count - 1
        reversed(&chs, start: 0, end: n - 1)
        reversed(&chs, start: n, end: end)
        reversed(&chs, start: 0, end: end)
        return String(chs)
    }

    func reversed(_ chs: inout [Character], start: Int, end: Int) {
        var start = start, end = end
        if start < chs.count && end < chs.count && start < end {
            while start < end {
                chs.swapAt(start, end)
                start += 1
                end -= 1
            }
        }
    }

思路二:swift高阶函数

    func reverseLeftWords(_ s: String, _ n: Int) -> String {
        return s.substring(from: n) + s.substring(to: n)
    }

面试题67:把字符串转换成整数