less than 1 minute read

283.移动零

题意


思路

我的最初的思路是:对于这个数组:使用双指针,一个指针p1指向0,一个指针p2指向第一个非0,然后找到了之后,将p2的值覆盖p1的值。然后两个同时后移。 终止条件是p2到达数组的末尾,此时将后面的非0数移动到前面了,然后就是要将后面的数变为0,要从p1开始后面的。

思路二:将数组看作栈,一个指针维护栈顶,一个指针维护当前变量,是0跳过,非0压入栈中,然后为了节省空间,可以直接使用原来的数组做栈。 之后将非0的数放入前面之后,将后面的几个变为0.

第一个思路和第二个思路都有一个不足,当数组全是0的话,都需要多次遍历,一次查找,一次变0.

思路三:上面思路的不足是因为非0数前移是覆盖,这个思路采用的是交换,保证两个数组之间维护着一组0,最终当右指针到了数组末尾的话,0就也到了末尾了。