移动零
这个题目所表达的意思就是先给我们一个数组,然后我们要编写一个算法使得这个数组中所有的0全部移动到该数组的末尾。这里还多加了一个要求就算我们不能另外创建另外一个数组去操作。
那么我们应该如何去编写这个算法呢?
思路讲解
1. 双指针的创建
这个题其实可以直接使用一个双指针去解决。首先我们创建两个指针,两个指针的位置都是数组的前面,只是这两个指针有着先后顺序。
2. 区域的划分
这两个指针就把数组分成了三个部分,依次是left的左边,left和right之间、right的右边。至此我们就可以规定left的左边这一块区域为已经处理完的数据,left和right中间放置的全是我们需要处理的0,right的右边放置的是未处理的元素。
3. 双指针处理方法
在规定完这些之后,我们就可以研究一下这两个指针是如何移动的了。
3.1 指针的初始化
首先,我们让left指向数组的开始位置的前一个位置,因为我们要对整个数组进行处理,而right指针的左边是已经处理完的元素,right指针的右边放置的是未处理的元素,然而通过我们刚刚的分析left指针一定在right指针的左边,所以,在初始化的时候我们的left指针得指向数组元素的前一个位置。
3.2 指针的移动
- 当right指针遇到0时:
当我们的right指针遇到0的时候应当直接自增1,而left指针不能动,因为我们刚刚的区域的划分的时候0是放在right指针和left指针之间的,而left指针又是指向已经处理完了的数据(非0)的最后一个位置,所以当我们的right指针遇到0的时候自增1而left指针不能动。
图示如下:
- 当right指针遇到非0元素时:
当我们right指针遇到非0元素时,我们应当让我们的right指针所指向的位置和left指针指向的下一个位置进行交换并且left指针自增1。
图示如下:
3.3 双指针的结束
从上面的过程我们就知道了这个双指针算法的原理,那么我们这个双指针算法该如何结束呢?很显然,当我们的right指针指向数组的下一个位置的时候我们的算法就结束了。因为这个时候说明我们的left和right的中间这一块代表着所有数据已经处理完的区域已经包含了我们的整个数组。
图示如下:
代码编写
在了解了以上的双指针算法解这个题的思路之后我们就可以进行代码编写了。
具体代码及运算结果如下:
以上就是我们的双指针算法第一期移动零的全部讲解,感谢大家的阅读。