常熟建設(shè)銀行 招聘網(wǎng)站seddog站長之家
一、雙指針
1.1移動零
鏈接:283. 移動零 - 力扣(LeetCode)?
給定一個數(shù)組?
nums
,編寫一個函數(shù)將所有?0
?移動到數(shù)組的末尾,同時保持非零元素的相對順序。請注意?,必須在不復(fù)制數(shù)組的情況下原地對數(shù)組進(jìn)行操作。示例 1:
輸入: nums =[0,1,0,3,12]
輸出:[1,3,12,0,0]?
解法:
通過兩個指針(并非是真的指針,只是數(shù)組的下標(biāo)),dest和cur將長度為n的數(shù)組劃分為三個部分;
[0,dest]:cur已經(jīng)遍歷過的地方,處理過不為0的部分;
[dest+1,cur-1]:cur已經(jīng)遍歷過的地方,處理過為0的部分;
[cur,n-1]:cur未遍歷的地方;
第一種情況: cur指向數(shù)組元素為0
[0,dest]部分是處理過并且元素不為0的部分,cur指向0,所以處理后[0,dest]不變;
[dest+1,cur-1]部分是處理過為0的部分,所以處理后[dest+1,cur-1]長度加一;
[cur,n-1]部分長度減一;
?第二種情況: cur指向數(shù)組元素不為0
[0,dest]部分是處理過并且元素不為0的部分,cur指向1,所以處理后[0,dest]長度加一,dest往后移一位,用來存放1;
[dest+1,cur-1]部分是處理過為0的部分,所以處理后[dest+1,cur-1]長度不變;
[cur,n-1]部分長度減一;
?dest往后移一位,dest指向為0的部分,只需要將此時的dest指向和cur指向元素交換即可,之后cur++;
初始狀態(tài),dest=-1,cur=0;
1.nums[cur]為0,cur++;
2.nums[cur] 不為0,dest++后,在交換nums[dest]和nums[cur];
c++解法:?
class Solution {
public:void moveZeroes(vector<int>& nums) {for(int dest=-1,cur=0; cur<nums.size(); cur++){if(nums[cur])swap(nums[cur], nums[++dest]);}}
};
c語言解法:?
void moveZeroes(int* nums, int numsSize)
{for(int dest=-1,cur=0; cur<numsSize; cur++){if(nums[cur]){ int temp = 0;temp = nums[++dest];nums[dest] = nums[cur];nums[cur] = temp;}}
}