1. 复写零问题解析
这道题目要求我们在一个固定长度的整数数组中,遇到0就将其复制一次,后续元素依次后移,同时保证数组长度不变。听起来简单,但实际操作中需要考虑多种边界情况。
举个例子,给定数组[1,0,2,3,0,4],经过复写操作后应该变成[1,0,0,2,3,0,0]。但原数组长度固定,所以最终结果会是[1,0,0,2,3,0],最后一个元素4被丢弃。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 双指针解法思路
双指针法是解决这类数组修改问题的利器。我们需要两个指针:
- 一个指针(i)用于遍历原始数组
- 另一个指针(j)用于跟踪在新数组中的位置
具体步骤:
- 首先计算复写所有0后数组的总长度
- 从后向前遍历,这样可以避免覆盖还未处理的元素
- 遇到0就写入两次,其他数字写入一次
3. 边界情况处理
在实际编码中,有几个关键点需要注意:
- 当复写0导致数组越界时的处理
- 最后一个元素是否需要保留的判断
- 原地修改数组时的元素覆盖问题
4. 代码实现示例
python复制def duplicateZeros(arr):
n = len(arr)
zero_count = arr.count(0)
new_length = n + zero_count
i = n - 1
j = new_length - 1
while i >= 0 and j >= 0:
if arr[i] != 0:
if j < n:
arr[j] = arr[i]
j -= 1
else:
if j < n:
arr[j] = 0
j -= 1
if j < n:
arr[j] = 0
j -= 1
i -= 1
5. 复杂度分析
时间复杂度:O(n),我们只遍历了数组两次
空间复杂度:O(1),没有使用额外空间
6. 常见错误与调试技巧
新手常犯的错误包括:
- 忘记处理数组
