Cursor

1.对Cursor 做一个简单的测试,实现一个LRU

  • 实现的效果还可以,和力扣上的答案方法几乎一致,但是Cursor用到了范型考虑的比较全面,但力扣也那题也用不到范型。

2.测试一下让它生成一个日期计算的类,并放在生成的指定文件夹下。

  • 能按描述实现,并生成了指定文件夹,而且日期类提供的功能也比较全面。

    func.png

3. 让Cursor实现一个随机生成由数字和字母组成的五位不重复Id,之前被问到的一个面试题

  • 它实现的方法是,生成随机组合然后通过哈希表去重,而且还考虑到了线程安全问题,用队列处理线程安全。算是简单粗暴。

    当时我面试的时候也是这样想的,但是考虑到有没有不通过缓存去重的方式获取唯一id的方法,在这个点上我陷的有点深了。难道没有吗,应该有,但是这种生成的id应该是有规律可循的,就不随机

  • 这是Cursor实现的代码

    import Foundation
      
    /// 生成由数字和字母组成的、不重复的 5 位 key
    final class UniqueKeyGenerator {
      
        /// 字符集:0-9, a-z, A-Z(共 62 个字符)
        private static let characters: [Character] = {
            let digits = (0...9).map { Character(String($0)) }
            let lower = "abcdefghijklmnopqrstuvwxyz".map { $0 }
            let upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".map { $0 }
            return digits + lower + upper
        }()
      
        private var usedKeys: Set<String> = []
        private let queue = DispatchQueue(label: "com.testco.uniquekeygenerator", attributes: .concurrent)
      
        /// 已生成的 key 数量
        var count: Int {
            queue.sync { usedKeys.count }
        }
      
        init() {}
      
        /// 生成一个新的不重复 key(5 位,仅包含数字和字母)
        /// - Returns: 5 字符的 key,线程安全
        func generate() -> String {
            queue.sync(flags: .barrier) {
                var key: String
                var attempts = 0
                let maxAttempts = 1000
                repeat {
                    key = Self.randomKey()
                    attempts += 1
                    if attempts >= maxAttempts {
                        fatalError("UniqueKeyGenerator: 在 \(maxAttempts) 次尝试后仍无法生成新 key,可能已耗尽 5 位空间")
                    }
                } while usedKeys.contains(key)
                usedKeys.insert(key)
                return key
            }
        }
      
        /// 标记某个 key 为已使用(例如从持久化恢复)
        /// - Parameter key: 5 位字母数字 key
        func markAsUsed(_ key: String) {
            guard key.count == 5, key.allSatisfy({ Self.characters.contains($0) }) else { return }
            queue.sync(flags: .barrier) {
                usedKeys.insert(key)
            }
        }
      
        /// 检查 key 是否已被使用
        func isUsed(_ key: String) -> Bool {
            queue.sync { usedKeys.contains(key) }
        }
      
        /// 清空已使用记录(之后可重新生成曾出现过的 key)
        func reset() {
            queue.sync(flags: .barrier) {
                usedKeys.removeAll()
            }
        }
      
        private static func randomKey() -> String {
            String((0..<5).map { _ in characters.randomElement()! })
        }
    }
      
    

总结来说:

  • 对于日常开发的还是能提速的。后续再测试一下复杂业务,比如说业务开发中对需求的理解,以及对已存在代码的理解程度,怎么能够更好的切入原有项目。