查找所有总和等于给定总和的唯一对

时间:2018-11-07 15:49:20

标签: arrays swift sorting

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

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

2 个答案:

答案 0 :(得分: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)]

答案 1 :(得分:0)

这是您可以选择的选项之一

    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