【问题标题】:swift subset of array match the duplicate elements数组的快速子集匹配重复元素
【发布时间】:2021-12-24 13:06:47
【问题描述】:

场景:

let superTrue = [1,2,3,3]
let superFalse = [1,2,3]

let sub = [2,3,3]

要求:

subsuperTrue 的子集,但不是 superFalse

错误代码:

print(Set(sub).isSubset(of: superTrue)) // true
print(Set(sub).isSubset(of: superFalse)) // true

因为Set(sub)[2,3],删除重复的3

不要删除重复项并计算子集,有什么想法吗?

【问题讨论】:

  • 顺序重要吗?换句话说,如果sub = [3,2,3] 仍然匹配superTrue

标签: arrays swift set


【解决方案1】:

Set 将始终根据其性质删除重复项。

其中一个选项是计算所有三个数组中所有元素的出现次数:

let subCounts = sub.reduce(into: [:]) { $0[$1, default: 0] += 1 }
let superTrueCounts = superTrue.reduce(into: [:]) { $0[$1, default: 0] += 1 }
let superFalseCounts = superFalse.reduce(into: [:]) { $0[$1, default: 0] += 1 }

然后检查想要的子数组的所有键的值是否等于或小于“超级”数组的相同键的值:

subCounts
  .keys
  .allSatisfy { subCounts[$0, default: 0] <= superTrueCounts[$0, default: 0] }
subCounts
  .keys
  .allSatisfy { subCounts[$0, default: 0] <= superFalseCounts[$0, default: 0] }

这将给出您期望的输出(据我理解的问题)。

注意 1。 由于您最初尝试使用 Set,因此我认为顺序无关紧要,您只关心特定元素及其出现的次数。

注意2。元素应为Equatable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2011-09-05
    • 2018-12-31
    • 2014-02-23
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    相关资源
    最近更新 更多