題目:給你一個長度固定的整數數組 arr,請你將該數組中出現的每個零都複寫一遍,並將其餘的元素向右平移。
注意:請不要在超過該數組長度的位置寫入元素。
要求:請對輸入的數組 就地 進行上述修改,不要從函數返回任何東西。
解讀: 遇到0複寫是指將其往內存在寫一次,然後其餘元素整體向右移動,那麼就會在原來0的位置的後一個繼續補一個0
示例 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. 1 <= arr.length <= 10000
2. 0 <= arr[i] <= 9
解答:
輸入:[1,0,2,3,0,4,5,0]
遇到第一個0:[1,0,0,2,3,0,4,5]
注:中間的那個0是由於移動而產生的
遇到第三個0:[1,0,0,2,3,0,0,4]
代碼:
class Solution {
public void duplicateZeros(int[] arr) {
for (int i = 0, len = arr.length; i < len; i++) {
if (arr[i] == 0) {
//移動方法
move(arr, i, len);
//將其餘元素右移會在當前0的位置後面繼續產生一個0,所以需要繼續自加,不然之後的都會爲0
i++;
}
}
System.out.println(Arrays.toString(arr));
}
private static void move(int[] arr, int i, int len) {
// 已經到了末尾不需要移動了
if (i >= len)
return;
//從最後一位開始移動
for (int j = len - 1; j > i; j--)
arr[j] = arr[j - 1];
}
}
結果: 在內存上還是可圈可點的嗎,但是速度那就是慘不忍睹了。