实现一个名叫 Multiset 的集合数据结构,要具有如下的方法
count(for:)返回相应数据的存储个数;add(_:)添加数据;- 删除数据
remove(_:)。
举例:
m = Multiset()
m.add("cat")
m.add("dog")
m.add("cat")
m.count(for: "cat") -> 2
m.remove("cat")
m.count(for: "cat") -> 1
实现一
我的第一感觉是像一个数组一样的数据结构,所以并没有考虑时间复杂度方面的问题,就直接往下继续了,实现细节如下:
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)
}
}
}
这里时间复杂度确实有待优化的地方,下面我们换成字典的形式再来一次。
实现二
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