海口网站自助建站,邢台中高风险地区查询,猪八戒包装设计,linux配置wordpress力扣#xff08;LeetCode#xff09;. - 备战技术面试#xff1f;力扣提供海量技术面试资源#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/duplicate-zeros/
使用 双指针 来解题#xff1a;
具体思路
如果是和00…力扣LeetCode. - 备战技术面试力扣提供海量技术面试资源帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/duplicate-zeros/
使用 双指针 来解题
具体思路
如果是和001题一样的,使用双指针从前往后扫描并且修改相关的值的话会出现某些值被覆盖不能完成题目要求。于是我们采用双指针从后往前覆写。
分为三步走
1.让双指针从左往右扫描让右指针遍历数组左指针遇见非0的数就向右1遇见0的数就向右2。这样做的目的是让两个指针能够刚好停在一个位置这个位置的左边是保留下来的数字这个位置的右边是舍弃掉的数字 2.处理特殊情况。如果在数组倒数第二个数则会出现L指针超过数组的长度的情况 此时要处理这种特殊的情况把R和L中间的元素变成0并且让R和L都往前移动一个。此时再继续进行下一步。
3.从后往前覆写。当R位置不为0的时候让R和L都向左移动就可以了。当R位置的值为0的时候让L的位置也变成0并且让R--L-2。因为在第一步已经规定了两个指针对应的位置所以L一次性向左移动两个位置也不会出现位置错乱的情况。
代码
class Solution {public void duplicateZeros(int[] arr) {int left -1;int right 0;int n arr.length;//1.先让left和right都到应该到的位置while(right n){if(arr[right] 0){left 2;}else{left;}if(left n-1){break;}right;}//2.处理特殊情况if(left n){arr[n-1] 0;left - 2;right--;}//3.从后往前覆写while(right 0){if(arr[right] ! 0){arr[left--] arr[right--];}else{arr[left--] 0;arr[left--] 0; right--;}}}
}