【题目描述】
给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。
要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。
【示例1】
输入:[1,0,2,3,0,4,5,0]
输出:null
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]
【示例2】
输入:[1,2,3]
输出:null
解释:调用函数后,输入的数组将被修改为:[1,2,3]
【提示】
1、1 <= arr.length <= 10000
2、0 <= arr[i] <= 9
【思路1】
1、循环遍历数组,找到0的位置index
2、数组从后向前遍历,依次向后移位,直到index+1的位置
3、赋值arr[index+1] = 0
4、外层遍历的i++,因为插入了一个0
5、时间复杂度O(n^2)
6、空间复杂度O(1)
Swift代码实现:
func duplicateZeros(_ arr: inout [Int]) {
var i = 0
while i < arr.count {
if arr[i] == 0 {
var tmp = arr.count-1
while tmp-i > 1 {
arr[tmp] = arr[tmp-1]
tmp-=1
}
arr[tmp] = 0
i+=1
}
i+=1
}
}
【思路2】这个咋没想到呢
1、只需一次遍历
2、找到0的index,直接index+1 赋值0
3、遍历数i++
4、去掉数组最后一位
5、时间复杂度O(n)
6、空间复杂度O(1)
Swift代码实现:
func duplicateZeros(_ arr: inout [Int]) {
var i = 0
while i < arr.count {
if arr[i] == 0 {
arr.insert(0, at: i+1)
arr.removeLast()
i+=1
}
i+=1
}
}