将0移动到末尾
问题描述
给定一个整数数组,将所有0移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
解题思路
使用原地算法思想,将非零元素移动到数组的前面,然后将剩余位置填充为0。
// ! 将给定数组的0移动到数组末尾
//! 要求:不能使用额外的空间,且时间复杂度为O(n)
export function moveZerosToEnd(arr: number[]) {
let zeroIndex = 0;
for (let j = 0; j < arr.length; j++) {
if (arr[j] === 0) {
zeroIndex++;
continue;
}
if (zeroIndex > 0) {
arr[j - zeroIndex] = arr[j];
arr[j] = 0;
}
}
}
代码演示
移动零到末尾
原始数组
0, 1, 2, 3, 4, 5, 6, 7, 0, 9, 10, 0, 12, 0, 14, 15, 0, 17, 18, 19, 20, 21, 0, 23, 0, 25, 0, 27, 28, 29, 30, 31, 0, 0, 34, 35, 36, 37, 38, 0, 0, 41, 42, 43, 0, 45, 46, 47, 0, 49, 50, 51, 0, 53, 54, 0, 0, 57, 58, 59, 60, 61, 62, 63, 0, 0, 0, 67, 68, 69, 70, 71, 0, 73, 74, 75, 76, 0, 0, 79, 0, 81, 82, 83, 84, 85, 86, 87, 0, 89, 90, 0, 92, 93, 94, 95, 0, 97, 98, 0
处理后数组
1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 14, 15, 17, 18, 19, 20, 21, 23, 25, 27, 28, 29, 30, 31, 34, 35, 36, 37, 38, 41, 42, 43, 45, 46, 47, 49, 50, 51, 53, 54, 57, 58, 59, 60, 61, 62, 63, 67, 68, 69, 70, 71, 73, 74, 75, 76, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 92, 93, 94, 95, 97, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0