复写零
- .
- 习题链接
- 题目描述
- 算法原理
- 初始值
- 步骤1
- 步骤2
- 我的答案:
.
习题链接
复写零
题目描述
给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。
输入: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]
算法原理
这道题用到的算法是双指针算法,我们定义两个指针:cur和dest,这两个指针需要帮助我们完成两件事:
- 找到最后一个复写的数
- 从后往前进行复写操作
初始值
cur的初始值为0,因为它需要从零开始遍历数组中的数
dest的初始值为-1,因为它表示复写后的最后一位数的地址
步骤1
步骤1是利用双指针中的快慢指针来完成:
- 判断当前cur的值是否为0
- 如果cur为零,dest就往后走两步,不为零则走一步
- 判断当前dest是否已经走到数组的末尾,如果没有,则执行下一步
- cur++
步骤2
- 判断dest是否已经越界,如果已经越界,执行下面步骤
a. 将n-1的位置修改为0
b. cur向前倒退一步,即cur–;dest倒退两步 - 从cur位置开始遍历数组,依次进行复写操作
- 判断cur当前的值:
a. 如果是0,dest以及dest-1的位置修改为0,然后dest-=2;
b. 如果非0,dest位置修改为cur位置的值,dest-=1;
c.cur–,然后复写下一个数
我的答案:
class Solution {
public void duplicateZeros(int[] arr) {
int cur = 0;
int dest = -1;
int n = arr.length;
//1.找到复写的最后一个数
for(;dest<=n-1;cur++){
if(arr[cur]==0){
dest+=2;
}else{
dest++;
}
if(dest>=n-1) break;
}
//2.从后往前进行复写
//a.处理特殊情况
if(dest>n-1){
arr[n-1]=0;
cur--;
dest-=2;
}
while(cur>=0){
if(arr[cur]==0){
arr[dest--]=0;
arr[dest--]=0;
}else{
arr[dest--]=arr[cur];
}
cur--;
}
}
}