双指针的初始用法
leetcode228:移动零(典型事例)
第一种情况(逐个替换的情况):
- 首先建立两个指针,其中的一个指针遍历该数组,第二个指针起到一个筛选的作用.
- 当第一个指针指向不为零的数时,第二个指针就会让自身所对应的数变为第一个指针所对应的数,并且第二个指针增加1.
- 直到遍历完数组后,数组的索引为第二个指针之前所对应的数字已经按照没有零元素,且按之前顺序而排好了.
- 最后将第二个索引之后的数组内容全部替换为零就好.
接下来是该步骤的代码:
public void moveZeroes(int[] nums) {
int j=0;
for (int i = 0; i <nums.length; i++) {
if(nums[i]!=0){
nums[j++]=nums[i];
}
}
for(; j<nums.length;j++){
nums[j]=0;
}
}
第二种情况(逐个交换的情况)
- 首先和第一种情况一样创建两个指针,一个指针用来遍历,一个指针用来筛选.
- 当第一个指针指向不为零的数时,第二个指针就会让自身所对应的数与第一个指针所对应的数交换位置,并且第二个指针增加1.
- 直到遍历完数组后,数组的索引为第二个指针之前所对应的数字已经按照没有零元素,且按之前顺序而排好了.
接下来是该步骤的代码:
public void moveZeroes3(int[] nums){
int i=0;
int j=0;
while(i<nums.length){
if(nums[i]!=0){
swap(nums,i,j);
j++;
}
i++;
}
}
private void swap(int[] nums,int left,int right){
int temp=nums[left];
nums[left]=nums[right];
nums[right]=temp;
}