Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
问题
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
分析
第一种解决:将不是 0 都往前转移,如果把非0的往前挪,对数组进行遍历,遇到0时,将后一位往前移动,并记录0位数,然后最后都以 0 补充剩余的。这种是最容易理解也是最容易想到的,代码比较简单。
需要注意临界条件的场景,比如是个空数组或者只有一个元素的数组。
第二种解决:
使用了一个临时数组,将非0数组都 push 到temp里面,然后在补全0;这种方式和第一种其实都是一样的思路,在考虑时间复杂和空间复杂度,额外消费了空间复杂度,所以这种没有第一种有优势。
代码
function func_exerise4(nums) {
if (nums == null || nums.length == 0)
return;
let index = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] != 0)
nums[index++] = nums[i];
}
while (index < nums.length) {
nums[index++] = 0;
}
}
总结
数组类型的题目,主要解决方法:
1、暴力解决:直接通过暴力遍历,遍历每个元素进行解决,并同时增加额外空间进行处理
2、二分法解决:针对的是有序数组且无重复的元素,然后再划分区间,分组解决
3、双指针:主要通过通过一个快指针和慢指针在一个for循环下完成两个for循环的工作