成都网站成都网站制作公司,西安百度推广优化托管,移动端网站怎么布局,上海网站制作公司怎么找力扣 283 移动零 解法一#xff1a;双指针
定义一个指针 cur 去遍历数组 #xff1b; 定义一个指针 dest 去指向已处理区间中#xff0c;非零的最后一个位置。 然后让 指针 cur 遇到 0 #xff0c;就往后走 #xff1b; 遇到的数不是 0 #xff0c;就与 dest指针的下…力扣 283 移动零 解法一双指针
定义一个指针 cur 去遍历数组 定义一个指针 dest 去指向已处理区间中非零的最后一个位置。 然后让 指针 cur 遇到 0 就往后走 遇到的数不是 0 就与 dest指针的下一个数交换位置直至将数组遍历结束为止。 cur 指向不是0 的位置 让dest1位置的数与cur 位置的数交换swap(nums[cur], nums[dest1) 两个指针的向前走一步。
代码实现
class Solution {
public:void moveZeroes(vectorint nums) {int dest -1;int cur 0;while(cur nums.size()){if(nums[cur] 0){cur;}else{swap(nums[dest1],nums[cur]); //有封装的交换函数dest; //vector里面封装的swap是将两个数组进行交换而不是两个数cur;}}}
}; 解法二
同样使用双指针i 和 j 不过不是使用交换而是将后面的非零元素覆盖前面的0元素。
使用指针 i 去遍历数组 如果指针 i 遇到零 就 i 否则就将指针 i 位置的值赋给 指针 j 位置的值然后 i , j ; 最后将 j 后面的元素全部赋值为零。
class Solution {
public:void moveZeroes(vectorint nums) {int i 0, j 0;while(inums.size()){if(nums[i] 0){i;}else{nums[j] nums[i];j;i;}}//将 j 后面的元素赋值为0 while(jnums.size()){nums[j] 0;j;}}
};
解法三
使用指针 cur 遍历数组 如果遇到零 删除当前位置的零元素并在数组末尾插入一个零元素如果遇到的不是零 cur直接往后面走一位。
class Solution {
public:void moveZeroes(vectorint nums) {int len nums.size(); // 用len来限制循环次数int cur 0 ;while(len 0){if(nums[cur] 0){nums.erase(nums.begin()cur);nums.push_back(0);}else{cur;}--len;}}
}; 解法四
用来优化解法三的算法解法三中在指针cur 走到后面全零区间的第一个元素时就已经满足题目要求的结果了应当结束但解法三多走了 x 步x为数组nums中零元素的个数因此需要记录数组非零元素的个数当指针 cur 等于非零元素个数时就结束循环。
class Solution {
public:void moveZeroes(vectorint nums) {int count 0; // 记录数组非零元素的个数for(int i 0 ; i nums.size();i){if(nums[i] !0){count;}}int cur 0 ;while(cur nums.size()){if(nums[cur] 0){if(cur count){break;}nums.erase(nums.begin()cur);nums.push_back(0);}else{cur;}}}
};