題目:輸入一個正數S,打印出所有和為S的連續正數序列(至少有兩個數)。例如輸入15,由于1+2+3+4+5=4+5+6=7+8=15,所以結果打印出3個連續序列15,46和7~8.
這個題目和上篇文章的解法類似,之前兩個數字一個開頭一個結尾,此次是兩個起始位置相鄰.
核心代碼:
<pre><code>`
func findContinuousSequence(sum:Int) -> [[Int]]? {
if sum <= 0 {
return nil
}
var small:Int = 1
var big:Int = 2
let mid:Int = (1 + sum)/2
var allSequence:[[Int]] = []
var currentSum:Int = small + big // 至少兩個數字,small最多到一半位置
while small < mid {
if currentSum == sum {// 相等保存
continuousSequence(small: small, big: big, data: &allSequence)
}
while currentSum > sum && small < mid { // 大于sum,增加small,先減后加
currentSum -= small
small += 1
if currentSum == sum {
continuousSequence(small: small, big: big, data: &allSequence)
}
}
big += 1// 小于sum,增加big
currentSum += big
}
return allSequence
}
func continuousSequence(small:Int,big:Int,data:inout [[Int]]) {
var temp:[Int] = []
for i in small...big {
temp.append(i)
}
data.append(temp)
}`</code></pre>
測試代碼:
<pre><code>var sumSequenceArr:[[Int]]? = searchSum.findContinuousSequence(sum: 15) if sumSequenceArr != nil { print("FlyElephant-連續正數序列數組--\(sumSequenceArr!)") }
</code></pre>