标签:arr int top -- 复写 LeetCode 指针
给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
1. 暴力法
从后往前遍历,碰到0将所有元素后移,即再从后往前遍历一次
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int n = arr.size();
for(int i =n-1;i>=0;i--){
if(arr[i]==0){
for(int j=n-1;j>i;j--){
arr[j] = arr[j-1];
}
}
}
}
};
2. 双指针模拟栈
其实就是先计算有多少个零需要复写,求复写区间,然后做复写区间到全区间的映射
先从前往后求区间,再从后往前做映射,相比暴力法减少了重复遍历
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int n = arr.size();
int top = 0;//栈顶
int i = -1;//遍历数组指针
while (top < n) {//其实目的就是记录能复写的0的个数
i++;
if (arr[i] != 0) {//栈顶移动一格
top++;
} else {
top += 2;//栈顶移动两格,里面包含的数由数组指针前的数组成
}
}//出循环后得到位置i,i后面数皆被挤出
int j = n - 1;//指针从数组末位置开始
if (top == n + 1) {//如果i位置为0
arr[j] = 0;//移动过去,无需复写
j--;//右指针前移
i--;//左指针前移
}
while (j >= 0) {//
arr[j] = arr[i];//移动元素
j--;//右指针前移
if (!arr[i]) {//判断左指针是否为零
arr[j] = arr[i];//复写
j--;//右指针前移
}
i--;//左指针前移
}
}
};
标签:arr,int,top,--,复写,LeetCode,指针 来源: https://www.cnblogs.com/929code/p/16384283.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。