我想找到所有和对等于给定和的唯一对。我实现了一个解决方案,但它只返回找到的第一对。
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
答案 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