Найти все уникальные пары, сумма которых будет равна заданной сумме - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу найти все уникальные пары, сумма которых будет равна заданной сумме. Я реализую решение, но оно возвращает только первую найденную пару.

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 голосов
/ 07 ноября 2018

вот один из вариантов, который вы можете сделать

    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

0 голосов
/ 07 ноября 2018

Вы выходите из функции раньше, вызывая 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)]

...