本文主要是介绍「优选算法刷题」:复写零,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、题目
给你一个长度固定的整数数组 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]
提示:
1 <= arr.length <= 104
0 <= arr[i] <= 9
二、思路解析
这道题我们需要明确的关键一点:复写操作是从后向前的。
为什么呢?
我们脑海中模拟一下就知道了,如果由前向后复写,那后面的数不就被覆盖了吗?这是不可取的。
明确这点之后,我们接下来就要利用 双指针 来遍历数组,遇到值为 0 的元素,dest 指针后移 2 位,否则后移 1 位,而cur 指针每次后移 1 位,让 cur 指针指向最后一个非零元素,dest 指针指向最后一个元素。
这个过程需要处理一下临界情况,也就是避免 dest 指针越界的情况发生。
最后的复写操作,其实类似前一步,遇到值为 0 的元素,dest 指针前移 2 位,否则前移 1 位,而cur 指针每次后移 1 位;同时,值不为 0 的元素,则把 cur 指针的元素赋给 dest 指针。
三、完整代码
public class Solution {public void duplicateZeros(int[] arr) {int cur = 0 , dest = -1;//找到最后一个非零元素while ( cur < arr.length) {if (arr[cur] == 0){dest+=2;}else {dest++;}if(dest >= arr.length-1){break;}cur++;}//处理临界情况if (dest == arr.length) {arr[arr.length - 1] = 0;cur--;dest -= 2;}//复写操作while(cur >= 0) {if (arr[cur]!=0){arr[dest--]=arr[cur--];}else {arr[dest--] = 0;arr[dest--] = 0;cur--;}}}
}
以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!
这篇关于「优选算法刷题」:复写零的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!