最近看到一道算法题,将两个有序数组合并成一个有序数组
类似[1,3],[2,4,6]合并之后为[1,2,3,4,5]
看到题目之后,开始分析。我们先用一个while循环来比较两个数组的元素,都从最开始的元素开始,也就是第0位,如果前面的大,那个元素更小,那个加入到一个新的数组,然后记录两个的顺序,直到任何一个数组的元素使用完结束第一轮循环。
func mergeArray(_ first: [Int], _ second: [Int]) -> [Int] {
var num1: Int = 0
var num2: Int = 0
var newArr: [Int] = []
//任何一个数组的元素都是用完了我们就结束第一轮
while num1 < first.count && num2 < second.count {
if first[num1] < second[num2] {
newArr.append(first[num1])
num1 = num1 + 1
} else {
newArr.append(second[num2])
num2 = num2 + 1 }
}
return newArr
}
结束第一轮之后,我们就会发现第一轮结束后另外一个数组还有一部分元素并没有被添加到新得数组中,这个时候我们开始第二轮,思路跟第一轮一样的,这次我们知道哪一个没遍历完,我们把没遍历完的元素添加进去就好了。
func mergeArray(_ first: [Int], _ second: [Int]) -> [Int] {
var num1: Int = 0
var num2: Int = 0
var newArr: [Int] = []
//判断是哪个先结束 这个变量完全可以省掉 通过比较 num1或者num2跟原数组的长度就可以得出结论谁遍历完了
var firstFin: Bool = false
while num1 < first.count && num2 < second.count {
if first[num1] < second[num2] {
newArr.append(first[num1])
num1 = num1 + 1
firstFin = num1 == first.count
} else {
newArr.append(second[num2])
num2 = num2 + 1
firstFin = num2 != second.count
}
}
if firstFin { //如果第一个已经遍历完了就直接把第二个的原色加到新数组就好了
while num2 < second.count {
newArr.append(second[num2])
num2 = num2 + 1
}
} else {
while num1 < first.count { //如果第二个已经遍历完了就直接把第二个的原色加到新数组就好了
newArr.append(first[num1])
num1 = num1 + 1
}
} print(newArr)
return newArr
}
好了,既然代码写好了,测试一下吧
我们输入两个数组mergeArray([1,3,5], [0,2,4,6,10])
好了,应该没有什么大问题了,就这样,我们就完成了一道有序数组的合并的题目