Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一.题目
283. 移动零 给定一个数组
nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
1 <= nums.length <= 104-231 <= nums[i] <= 231 - 1
二、思路分析:
看题目,又是对数组的元素进行相关的操作,能够想到什么思路?答案是双指针,但是这道题与普通的双指针题目不同,因为这道题是要在不复制数组的情况下原地对数组进行操作,所以我们不能够创建额外的空间对数组元素进行操作,所以我们需要知道怎么在不创建额外空间的情况下能够把0全部移动到数组的末尾。
本题的最终思路就是:先利用双指针将数组中的0全部去掉,然后将慢指针以及之后的索引代表的数值全部设为0即可完成要求。
三、代码:
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
if(nums.length == 1) return nums
//还是利用双指针
let slow = 0,fast = 0
while(fast<nums.length){
if(nums[fast] !== 0){
//不等于0对slow进行操作
nums[slow] = nums[fast]
slow++
}
fast++
}
for(let i=slow ; i<nums.length ; i++){
nums[i] = 0
}
return nums
};
四、总结:
这种原地更改数组的题目通常都是使用双指针的套路,当然除了双指针的套路还有很多的思路去求解问题,当我发现我的算法时间复杂度比较高的时候看到了别人利用
sort函数一行代码也是可以解决这道题的,别人仅用一行代码nums.sort((a,b) => b? 1: -1)就能够完成操作就很值得我们学习,这是熟练掌握了JS的成果0.0