这是我参与更文挑战的第26天,活动详情查看: 更文挑战
题目描述
移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
leetcode-cn.com/problems/re…
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。
标签
双指针
解题分析
1. 双指针
直接上讲解。
定义两个指针,快指针、慢指针。
快指针用于遍历判断元素是否是0。
如果不是0,将其值给到慢指针指向的元素,慢指针右移。
若是0则不作操作。
快指针遍历完成后,所有不是0的元素都被赋值到数组的前面,
从慢指针的位置开始,数组后面的数都设置为0即可。
很简单,我们先创建快慢指针。
快指针用来遍历数组
慢指针用来保存不为0的值
快指针遍历每一个元素时,会判断是否为0,如果不为0,那就把这个元素扔到慢指针的位置,接着移动慢指针。
例如:
[1,2,0,4,6]
1 不为0 那就放到第一个 [1]
慢指针++
2 不为0 那就放到第二个 [1,2]
慢指针++
0 为0, 那就不管他 [1,2]
4 不为0 那就放到第三个 [1,2,4]
6 不为0 那就放到第四个 [1,2,4,6]
快指针遍历结束。
拿到新的数组[1,2,4,6],并且用慢指针来给数组添加0
最终得到结果。
[1,2,4,6,0]
来人上代码!!!!!
/**
Do not return anything, modify nums in-place instead.
*/
function moveZeroes(nums: number[]): void {
// 创建快慢指针来记录
let index = 0;
for (let i = 0; i < nums.length; i++) {
// 如果当前的元素不是0,把元素指向到慢指针index上,是0就不用管
if (nums[i] !== 0) {
nums[index] = nums[i];
index++;
}
}
// 把慢指针后面的值都变为0
for (let i = index; i < nums.length; i++) {
nums[i] = 0;
}
};
另外记一个厉害老哥的写法。
/**
Do not return anything, modify nums in-place instead.
*/
function moveZeroes(nums: number[]): void {
nums.sort((a,b) => b? 0: -1)
};
最后
从今天开始不鸽,每天一道算法题并发布文章,首先想要解决的题组为Top100
,第十四道题目打完收工!!