Given a fixed length array arr of integers, duplicate each occurrence of zero, shifting the remaining elements to the right.

Note that elements beyond the length of the original array are not written.

Do the above modifications to the input array in place, do not return anything from your function.

Example 1:

Input: [1,0,2,3,0,4,5,0]

Output: null

Explanation: After calling your function, the input array is modified to: [1,0,0,2,3,0,0,4]

Example 2:

Input: [1,2,3]

Output: null

Explanation: After calling your function, the input array is modified to: [1,2,3]

Note:

1 <= arr.length <= 10000

0 <= arr[i] <= 9

Solution:

这题目的大概意思是让你遍历数组,如果遇到0就往0后面再添加一个0,之后的元素向右平移,超过数据长度的元素会被舍弃。

这里说只能原地修改数组,这句话有两种解释。第一个解释是不能使用额外的空间,第二个解释是不能返回新的数组(方法返回类型是void)。

解法一:队列标记替换

最直观的解法是,我们用一个队列保存需要平移的元素,然后遍历数组。如果队列不为空就用队列里最后加入的元素替换当前元素,如果遇到了0就把0加入到队列。

class Solution {
public void duplicateZeros(int[] arr) {
LinkedList<Integer> queue=new LinkedList<>();
for(int i=0;i<arr.length;i++){
if(0==arr[i]){
queue.add(arr[i]);
}
if(queue.size()>0){
queue.add(arr[i]);
arr[i]=queue.poll();
}
}
}
}

该解法性能如下:

执行用时 : 4 ms, 在所有 Java 提交中击败了57.21%的用户

内存消耗 :37.4 MB, 在所有 Java 提交中击败了100.00%的用户

解法二:双指针

双指针也许是本题的最优解法。具体思路是维护一个快指针和一个慢指针。快指针是遇到0就多进一步。这样遍历一遍数据后,快指针和慢指针会有一个差值。这个差值就是需要填充0的个数。

接下来,我们需要从后向前遍历数组。如果慢指针指向的元素不为0,则把快指针指向的元素替换为慢指针指向的元素;如果慢指针指向的元素为0,则把快指针和快指针之前指向的元素替换为0。

你可能会发现对于不同的数组,第一遍遍历之后fast指针的值是不一样的。区别在于数组末尾是否为0,如果末尾为0,则fast指针的值(数组索引)为数组长度+1。如果末尾不是0,则fast指针的值是数组长度。其实数组最后一位是0的话,其实是不用复制这个值的。因此从后向前遍历的时候需要判断fast指针的值是否小于n,这样就可以把数组末尾为0的时候就不会复制了。

class Solution {
public void duplicateZeros(int[] arr) {
int slow = 0;
int fast = 0;
int n = arr.length;
while (fast < n) {
if (arr[slow] == 0) {
fast++;
}
fast++;
slow++;
}
fast--;
slow--;
while (slow >= 0) {
if (fast < n) {
arr[fast] = arr[slow];
}
if (arr[slow] == 0) {
arr[--fast] = arr[slow];
}
fast--;
slow--;
}
}
}

该解法性能如下:

执行用时 : 1 ms, 在所有 Java 提交中击败了99.87%的用户

内存消耗 :37.1 MB, 在所有 Java 提交中击败了100.00%的用户

[LeetCode]1089. Duplicate Zeros的更多相关文章

  1. 【Leetcode_easy】1089. Duplicate Zeros

    problem 1089. Duplicate Zeros 题意: solution: 其中关于虚拟新数组的下标的计算还是有点迷糊... class Solution { public: void d ...

  2. 【leetcode】1089. Duplicate Zeros

    题目如下: Given a fixed length array arr of integers, duplicate each occurrence of zero, shifting the re ...

  3. LeetCode 1089. 复写零(Duplicate Zeros) 72

    1089. 复写零 1089. Duplicate Zeros 题目描述 给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移. 注意:请不要在超过该数组长 ...

  4. LeetCode.1089-重复的0(Duplicate Zeros)

    这是小川的第392次更新,第423篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第255题(顺位题号是1089).给定一个固定长度的整数数组arr,复制每次出现的零,将剩 ...

  5. [LeetCode] Remove Duplicate Letters 移除重复字母

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  6. [LeetCode] Contains Duplicate III 包含重复值之三

    Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...

  7. [LeetCode] Contains Duplicate II 包含重复值之二

    Given an array of integers and an integer k, return true if and only if there are two distinct indic ...

  8. [LeetCode] Contains Duplicate 包含重复值

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  9. [LeetCode] Delete Duplicate Emails 删除重复邮箱

    Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique ...

随机推荐

  1. AIX系统命令

    当/oracle达到一定使用量时需清除*.trc文件find . -name "*.trc"|xargs rm -rf 1.查看是否开启归档日志切换用户:su - oracle使用 ...

  2. linux简单命令10---权限

    1:文件权限设置 数字的用法:chmod 755 文件名 ---------------------------------------------下面是文件权限------------------- ...

  3. delphi 中Adoquery ,在打开时能否让记录指针不移动? [问题点数:40分,结帖人microd]

    delphi 中Adoquery ,在打开时能否让记录指针不移动?由于数据集Adoquery 时,它的针指称动会废时,能否在打开完成之前不让记录指针不移动.打开完毕之后再回复移动? 这样用:self. ...

  4. C#.NET中对称和非对称加密、解密方法汇总--亲测可用

    C#.NET中对称和非对称加密.解密方法汇总--亲测可用   在安全性要求比较高的系统中都会涉及到数据的加密.解密..NET为我们封装了常用的加密算法,例如:MD5,DES,RSA等.有可逆加密,也有 ...

  5. 红队(red team)

    红队资源相关 https://threatexpress.com/redteaming/resources/ 红队相关技术 https://github.com/bluscreenofjeff/Red ...

  6. vue弹窗后如何禁止滚动条滚动?

    原文地址 常见场景 在许多填写表单的页面中,都会弹出一个选择器,让你在弹窗中选择项目.有时,弹窗本身容纳不下内容,需要让它不断滚动来展示,但因为事件是冒泡的,有时就会造成底部(body 的Z-inde ...

  7. getopts的使用 + 创建空目录

    1.getopts的经典例子 isRollback= rollbackVer="" targetGroup="" actionType="" ...

  8. Stream系列(八)Reduce方法使用

    裁减计算 视频讲解:  https://www.bilibili.com/video/av77715582/ EmployeeTest.java package com.example.demo; i ...

  9. gitlab 安装升级

    GitLab,是一个使用 Ruby on Rails 开发的开源应用程序,与Github类似,能够浏览源代码,管理缺陷和注释,非常适合在团队内部使用. 安装方式: Bitnami一键安装:https: ...

  10. 语言I博客作业04

    问题 答案 这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/9771 我 ...