前言:剑指offer刷题系列
问题:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
思路:
一开始想到的是可以使用冒泡排序,将0看做最小值,冒泡上去,但我就浅浅想了一下毕竟感觉有点不太高级😂,因为这题需要用到双指针,所以没有去实践。后面看了大佬的题解后,用两个指针,i指针不停往前,遇到不是0的时候就将这个值赋给nums[j],然后j指针后移,达到将所有不是0的元素前移的效果,然后将j后面的所有元素变为0.
这个函数接受一个名为 nums
的整数列表作为输入,并在不复制数组的情况下,将所有的 0 移动到数组的末尾,同时保持非零元素的相对顺序。
具体实现时,我们使用了两个指针 i
和 j
来遍历数组。指针 i
指向当前已经处理好的序列的尾部,而指针 j
则用于遍历数组。当遇到一个非零元素时,我们就将其与指针 i
所指向的元素进行交换,并将指针 i
向后移动一位。这样,我们就可以不断地将非零元素放置到数组的前面,直到所有的非零元素都被处理完毕。
基于上述思考,代码如下:
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
不要返回任何内容,而是直接修改 nums。
"""
i = 0
j = 0
while j < len(nums):
if nums[j] != 0:
nums[i], nums[j] = nums[j], nums[i]
i += 1
j += 1
执行结果如下图:
学到的知识点:
- 双指针技巧:可以使用两个指针
i
和j
来遍历数组,并将非零元素移动到数组的前面。具体来说,当遇到一个非零元素时,将其与指针i
所指向的元素进行交换,并将指针i
向后移动一位。 - 原地修改数组:题目要求在不复制数组的情况下原地对数组进行操作。这意味着需要在给定的数组上进行修改,而不是创建一个新的数组。