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