leetcode题解

这道题是也是我在面试的过程中碰到的一个原题,这里写一下解法。

题目描述是这样的, 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

初次看,是想新开一个数组,然后把所有的零丢到最后,但是这样不满足题目中给定的要求。

或者用哈希表把0元素存储起来,然后再把元素丢到后面。但是这样同样需要新开一个数组,需要的空间复杂度为O(n).

最佳解法,双指针,解题思路可以选择在数组中用指针进行数组的index交换。其中一个数组必须指向第一个index,另外一个数组从零开始进行遍历,如果在首端的指针碰到了零,那么就选择与末端的指针索引对应的数进行交换。

nums=[1,1,3,4,0,0,2]
first=0
for i in range(len(nums)):
if nums[i]!=0:
nums[i],nums[first]=nums[first],nums[i]
first+=1
print(nums)
var movezeros=function(nums){
let anchor=0
for (let explorer=0;explorer<nums.length;explorer++){
if (nums[explorer]!==0){
let temp=nums[anchor];
nums[anchor]=nums[explorer];
nums[explorer]=temp;

anchor++;
}
}
};

   转载规则


《leetcode题解》 胡哲 采用 知识共享署名 4.0 国际许可协议 进行许可。