LeetCode #1089 Duplicate Zeros 复写零

1089 Duplicate Zeros 复写零

Description:
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:

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

题目描述:
给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。

要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

示例 :

示例 1:

输入:[1,0,2,3,0,4,5,0]
输出:null
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

示例 2:

输入:[1,2,3]
输出:null
解释:调用函数后,输入的数组将被修改为:[1,2,3]

提示:

1 <= arr.length <= 10000
0 <= arr[i] <= 9

思路:
先遍历数组, 记录 0的个数
从后往前遍历数组, 将 0的个数当作偏移量, 移动数组
时间复杂度O(n), 空间复杂度O(1)

代码:
C++:

class Solution 
{
public:
    void duplicateZeros(vector<int>& arr) 
    {
        int zero = 0, s = arr.size();
        for (auto i : arr) if (!i) ++zero;
        for (int i = s - 1; i > -1; i--)
        {
            if (!arr[i])
            {
                --zero;
                if (i + zero < s) arr[i + zero] = 0;
                if (i + zero + 1 < s) arr[i + zero + 1] = 0;
            }
            else if (i + zero < s) arr[i + zero] = arr[i]; 
        }
    }
};

Java:

class Solution {
    public void duplicateZeros(int[] arr) {
        int zero = 0, s = arr.length;
        for (int i : arr) if (i == 0) ++zero;
        for (int i = s - 1; i > -1; --i) {
            if (arr[i] == 0) {
                --zero;
                if (i + zero < s) arr[i + zero] = 0;
                if (i + zero + 1 < s) arr[i + zero + 1] = 0;
            }
            else if (i + zero < s) arr[i + zero] = arr[i]; 
        }
    }
}

Python:

class Solution:
    def duplicateZeros(self, arr: List[int]) -> None:
        """
        Do not return anything, modify arr in-place instead.
        """
        zero, s = 0, len(arr)
        for i in arr:
            if not i:
                zero += 1
        for i in range(s - 1, -1, -1):
            if not arr[i]:
                zero -= 1
                if i + zero < s:
                    arr[i + zero] = 0
                if i + zero + 1 < s:
                    arr[i + zero + 1] = 0
            elif i + zero < s:
                arr[i + zero] = arr[i]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 7,606评论 0 3
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 12,163评论 0 10
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,745评论 0 38
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 13,151评论 0 13
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 6,164评论 0 2