一、移动零
283. 移动零https://leetcode.cn/problems/move-zeroes/
给定一个数组
nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]输出:[0]
使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。
右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。
注意到以下性质:
左指针左边均为非零数;
右指针左边直到左指针处均为零。
因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int left = 0, right = 0;
while(right < nums.size())
{
if(nums[right])
{
swap(nums[right], nums[left]);
left++;
}
right++;
}
}
};
二、复写零
1089. 复写零https://leetcode.cn/problems/duplicate-zeros/
给你一个长度固定的整数数组
arr
,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。
示例 1:
输入:arr = [1,0,2,3,0,4,5,0] 输出:[1,0,0,2,3,0,0,4] 解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]示例 2:
输入:arr = [1,2,3] 输出:[1,2,3] 解释:调用函数后,输入的数组将被修改为:[1,2,3]
class Solution {
public:
void duplicateZeros(vector<int>& arr) {// 使用STL库中vector相关操作
int len = arr.size();
for(int i = 0; i < arr.size(); i++)
{
if(arr[i] == 0)
{
arr.insert(arr.begin()+i, 0);
i++;
}
}
arr.resize(len);
}
};
class Solution {
public:
void duplicateZeros(vector<int>& arr) { 暴力搬运
for(int i = 0; i < arr.size(); )
{
if(arr[i] == 0 && i+1 < arr.size())
{
for(int j = arr.size()-1; j > i; j--)
{
arr[j] = arr[j-1];
}
arr[i+1] = 0;
i+=2;
}
else
i++;
}
}
};