实现一个名叫 Multiset
的集合数据结构,要具有如下的方法
count(for:)
返回相应数据的存储个数;
add(_:)
添加数据;
- 删除数据
remove(_:)
。
举例:
1 2 3 4 5 6 7 8
| m = Multiset() m.add("cat") m.add("dog") m.add("cat")
m.count(for: "cat") -> 2 m.remove("cat") m.count(for: "cat") -> 1
|
实现一
我的第一感觉是像一个数组一样的数据结构,所以并没有考虑时间复杂度方面的问题,就直接往下继续了,实现细节如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| struct Multiset<T: Equatable> { var ary: [T] = []
mutating func add(_ element: T) { ary.append(element) }
func count(for element: T) -> Int { let filterResult = ary.filter { $0 == element } return filterResult.count }
mutating func remove(_ element: T) { if let idx = ary.firstIndex(of: element) { ary.remove(at: idx) } } }
|
这里时间复杂度确实有待优化的地方,下面我们换成字典的形式再来一次。
实现二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| struct Multiset<T: Hashable> { var dict: [T: Int] = [:] mutating func add(_ element: T) { dict[element, default: 0] += 1 } func count(for element: T) -> Int { return dict[element] ?? 0 } mutating func remove(_ element: T) { guard var count = dict[element] else { return } count -= 1 if count > 0 { dict[element] = count } else { dict.removeValue(forKey: element) } } }
|
这回好多了。
路漫漫其修远兮,吾将上下而求索。
我写的可能有点简略,更详细的叙述请看这里:Multiset