tags:
- 简答
- 参考
- 数组
flag: green
style: summer
date: ‘2019-6-27’
1089.复写零
一、题目
给你一个长度固定的整数数组 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/duplicate-zeros
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解答
- 大佬解答:
用一个队列将需要覆写的元素暂时保存起来,遇到0时就将0加入队列,当队列不为空时则做交换并入列
class Solution {
public void duplicateZeros(int[] arr) {
LinkedList<Integer> buf = new LinkedList<>();
for(int i=0;i<arr.length;i++) {
if(arr[i] == 0) {
buf.offer(0);
}
if(!buf.isEmpty()) {
buf.offer(arr[i]);
arr[i] = buf.poll();//检索并删除此列表的头(第一个元素)。
}
}
return;
}
}
作者:mu-mu-du-du
链接:https://leetcode-cn.com/problems/two-sum/solution/yong-dui-lie-ying-gai-huan-shi-bi-jiao-rong-yi-li-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 方法二:
class Solution {
public void duplicateZeros(int[] arr) {
int[] arr2 = Arrays.copyOf(arr,arr.length);
if(arr.length==1)return;
for(int i=0,move=0;i<arr.length;i++,move++){
arr[i]=arr2[move];
if(arr[i]==0&&i<arr.length-1){
arr[i+1]=0;
i++;
}
}
}
}
作者:xfatm
链接:https://leetcode-cn.com/problems/two-sum/solution/zui-zhi-jie-de-ban-fa-by-xfatm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 方法三:
分析:遇见零需要重复,但不是覆盖!所以用两个指针即可,遇见零则暂时不移动
下面是一种实现方式,还可以考虑遇见零让结果数组走两步赋值0,但这样就要考虑越界
class Solution {
public void duplicateZeros(int[] arr) {
/* 双指针 */
int len = arr.length;
int[] aux = arr.clone();
int i = 0; // pointer for arr
int j = 0; // pointer for aux
boolean isZero = false;
for (i = 0; i < len; i++) {
if (!isZero) {
int tmp = aux[j];
arr[i] = tmp;
if (tmp == 0) {
isZero = true;
}
j++;
} else {
isZero = false;
arr[i] = 0;
}
}
return;
}
}
复杂度分析
时间:O(N)
空间:O(N)
作者:Jiachen_Zhang
链接:https://leetcode-cn.com/problems/two-sum/solution/fen-xi-liang-chong-si-lu-yi-chong-shi-xian-by-jiac/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 不开空间解答
public void duplicateZeros(int[] arr) {
int zero = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
zero++;
}
}
for (int i = arr.length - 1, j = arr.length - 1 + zero; i >= 0; i--) {
if (arr[i] == 0) {
if (j < arr.length) {
arr[j--] = 0;
} else {
j--;
}
if (j < arr.length) {
arr[j--] = 0;
} else {
j--;
}
} else {
if (j < arr.length) {
arr[j--] = arr[i];
} else {
j--;
}
}
}
}
执行用时 :2 ms, 在所有 Java 提交中击败了95.12%的用户
内存消耗 :40.4 MB, 在所有 Java 提交中击败了100.00%的用户