leetcode283-移动零
https://leetcode.cn/problems/move-zeroes/
方法一:双指针法
设置两个指针 i 和 j ,
1 class Solution { 2 public: 3 void moveZeroes(vector<int>& nums) { 4 int i,j,size=nums.size(); 5 bool flag=false; 6 for(i=0,j=0;i<size&&j<size;) 7 { 8 if(nums[i]!=0) i++; 9 if(flag==true) 10 { 11 if(nums[j]==0) j++; 12 else 13 { 14 swap(nums[i],nums[j]); 15 i++; 17 flag=false; 18 } 19 } 20 else //flag==false 21 { 22 if(nums[j]!=0) j++; 23 else 24 { 25 flag=true;j++; 26 } 27 } 28 } 29 } 30 };
指针 i 一直指向第一个零,其左边全都是非零元素,当 j 在一串零后找到第一个非零数字,i 和 j 所指的元素互换,然后 i 向右移动一位。
更加优雅的代码
public void moveZeroes(int[] nums) { int length; if (nums == null || (length = nums.length) == 0) { return; } int j = 0; for (int i = 0; i < length; i++) { if (nums[i] != 0) { if (i > j) {// #1 nums[j] = nums[i]; nums[i] = 0; } j++; } } }
public void moveZeroes(int[] nums) { int i = 0;//统计前面0的个数 for (int j = 0; j < nums.length; j++) { if (nums[j] == 0) {//如果当前数字是0就不操作 i++; } else if (i != 0) { //否则,把当前数字放到最前面那个0的位置,然后再把 //当前位置设为0 nums[j - i] = nums[j]; nums[j] = 0; } } }
方法二:两次遍历
void moveZeroes(int* nums, int numsSize) { int i = 0,j = 0; for(i = 0 ; i < numsSize; i++) { if(nums[i] != 0) { nums[j++] = nums[i]; } } while(j < numsSize) { nums[j++] = 0; } }
想象成是两个数组,非0但按顺序放到第二个数组上,后面填0