购买网站广告位湛江专业建站推荐
题目:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
 请注意 ,必须在不复制数组的情况下原地对数组进行操作。
方法1:
快慢指针
 快指针负责遍历数组中所有元素,慢指针负责记录不为0的元素,最后慢指针所在下标位置及其后边位置的元素置位0即可
 public void moveZeroes1(int[] nums){
 if (nums.length == 0) {
 return;
 }
    int fast = 0;int slow = 0;while (fast<nums.length){if(nums[fast]==0){fast++;}else {//目的是把不为0的元素移动到前边去nums[slow] = nums[fast];slow++;fast++;}}for(int i=slow;i<nums.length;i++){nums[i]=0;}}
 
方法2:
左右指针玩法
 如果当前位置为0,只移动右指针
 如果当前位置不为0,就把左右指针的数据交换,左右指针再又移动,这样左指针始终在非0位置的尾部
 遇到0右指针移动快
 不遇到0两个指针在一块,差距就是0值的多少
 public void moveZeroes2(int[] nums){
 if(numsnull||nums.length0){
 return;
 }
    int n = nums.length;//左指针//右指针//右指针来到不为0的位置,就左右指针的位置交换,左指针来到非0位置的结尾。int left=0,right=0;while(right<n){if(nums[right]!=0){int temp = nums[left];nums[left] = nums[right];nums[right] = temp;left++;}right++;}}
