双指针
比较具有利用指针特性的一题
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
题解
因为想用双指针所以用了双指针,但是个人感觉对双指针的理解还是比较有利的
主要是利用两个指针checker和book,前者用来遍历,后者用来处理
核心在于:当checker检测到0的时候,book不会行动
而当其检测到非零数的时候,book会更新且移动
当checker移动到终点时,所有应该加入的非零数已经被添加了,那么剩下的就都是0了
于是,只要把此时book后面的数全部填充为0即可
class Solution {
public void moveZeroes(int[] nums) {
int n = nums.length ;
int checker = 0 ; //查找用
int book = 0; //转换用
while(checker<n){
if(nums[checker]!= 0){
nums[book] = nums[checker];
book++;
}
checker++;
}
for(int i = book ; i<n ; i++){
nums[i] = 0 ;
}
}
}
其中一个核心理解是:把book独立于checker存在,因为在每次checker检测的时候,book已经跟进更新数据了
而当checker检测到0的时候,book是不会移动的,在检测到0的时刻,checker和book处于同一个下标,
而下一时刻checker++
而 book不变,这样book就被停留在了一个是0的下标处
而当下一次checker检测到非0数的时候,book执行nums[book] = nums[checker];
从而抹去了这个零
因为前面的数都排好了,这次也更新了,于是book前进一个下标
如果checker连续检测到了0,那么book就会一直停留,直到checker检测到非0数而更新