【问题标题】:Find all the unique pairs whose sum will be equal to a given sum找到总和等于给定总和的所有唯一对
【发布时间】:2018-11-07 15:49:19
【问题描述】:

我想找到总和等于给定总和的所有唯一对。我实现了一个解决方案,但它只返回它找到的第一对。

func checkPairs(in numbers: [Int], forSum target: Int) -> String {    
    for (i, x) in numbers.enumerated() {
        for y in numbers[i+1 ..< numbers.count] {
            if x + y == target {
                return ("There is a pair that sums \(target): \(x)+\(y)=\(target)")
            }
        }
    }
    return "no pair"
}

print (checkPairs(in: [1, 2, 4, 4, 7, 5, 3], forSum: 8))

输出:

There is a pair that sums 8: 1+7=8

【问题讨论】:

  • 您对单个值执行return。而是使用一个数组来保存所有“工作”的对,在需要时附加一个新的对并返回它?
  • @Larme 使用 while 循环打印所有对 sum 8 是否很好?
  • 你的代码looks somewhat familiar :)

标签: arrays swift sorting


【解决方案1】:

当找到第一对时,您可以通过调用return 提前退出函数。相反,您应该返回一个包含对的元组数组,遍历所有对并将满足要求的对添加到返回数组中。

func checkPairs(in numbers: [Int], forSum target: Int) -> [(Int,Int)] {
    var pairs = [(Int,Int)]()
    for (i, x) in numbers.enumerated() {
        for y in numbers[i+1 ..< numbers.count] {
            if x + y == target {
                pairs.append((x,y))
            }
        }
    }
    return pairs
}

print(checkPairs(in: [1, 2, 4, 4, 7, 5, 3], forSum: 8))

输出:

[(1, 7), (4, 4), (5, 3)]

如果您正在寻找唯一的对,您可以定义一个包含这对数字的自定义类型并返回 Set 而不是 Array(需要自定义类型,因为您无法创建 Tuple符合Hashable,这是能够将元素添加到Set所必需的)。

struct Pair: Hashable {
    let smaller:Int
    let bigger:Int
    
    init(_ a:Int, _ b:Int) {
        if a < b {
            smaller = a
            bigger = b
        } else {
            smaller = b
            bigger = a
        }
    }
}

extension Pair: CustomStringConvertible {
    var description:String {
        return "\((smaller,bigger))"
    }
}

func checkPairs(in numbers: [Int], forSum target: Int) -> Set<Pair> {
    var pairs = Set<Pair>()
    for (i, x) in numbers.enumerated() {
        for y in numbers[i+1 ..< numbers.count] {
            if x + y == target {
                pairs.insert(Pair(x,y))
            }
        }
    }
    return pairs
}

print(checkPairs(in: [1, 2, 4, 4, 7, 5, 3], forSum: 8))
print(checkPairs(in: [1, 2, 4, 4, 7, 5, 3, 4, 1], forSum: 8))

输出:

[(4, 4), (3, 5), (1, 7)]

[(4, 4), (3, 5), (1, 7)]

【讨论】:

  • 如果我们正在寻找 unique 对,那么这不适用于以下数组:[1, 2, 4, 4, 7, 5, 3, 4, 1]
  • @Carpsen90 你说得对,更新了我的答案
【解决方案2】:

这是您可以做的选择之一

    let array = [1, 2, 4, 4, 7, 5, 3]
let target = 8


func checkPairs(in numbers: [Int], forSum target: Int) -> String {
    var pairs = ""
    for (i, x) in numbers.enumerated() {
        for y in numbers[i+1 ..< numbers.count] {
            if x + y == target {
                pairs += ("There is a pair that sums \(target): \(x)+\(y)=\(target)\n")
            }
        }
    }
    return pairs
}

print(checkPairs(in: array, forSum: target))

输出将是 有一个和为 8 的对:1+7=8 有一个对 总和为 8:4+4=8 有一对总和为 8:5+3=8

【讨论】:

  • 使用该格式返回单个String 是一个非常糟糕的主意。如果您以后需要它以进行进一步处理,真的很难解析它,而且由于其中包含大量重复信息,仅读取该字符串也很糟糕。
  • 也许他想在标签中这样展示它,然后你的展示很复杂,这就是为什么我说它是一种选择,这取决于他想做什么
猜你喜欢
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
相关资源
最近更新 更多