LeetCode题解:Move Zeroes

来源:互联网 发布:c语言实验转换字母 编辑:程序博客网 时间:2024/05/21 14:57

题目链接:

Move Zeroes


题目描述:

Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].
Note:
You must do this in-place without making a copy of the array.
Minimize the total number of operations.


题目解释:

这个题目的意思是将给定数组中的0全部移动到数组后面去,将非零元素放在数组前面,就像例子中给定的那样1、3、12三个元素提到数组的第1、2、3位置,其他0元素放在12之后。这个题目还有空间复杂度的要求:O(1),所以咱们不能复制整个数组再进行挑选操作了。


解题方案:

由题意我们可以知道,这个题目想做的是:将非零元素挑选出来按原来顺序置前,零元素置后,0元素之间其实是没有区别的,即0元素顺序无所谓。那么我们可以用一个变量pos在存储新的数组中元素的位置,从数组0索引开始,先处理非零元素,处理完毕后,直接将此时pos索引之后到numsSize的值全部赋为0即可。
还有一点:我们移动元素的操作可以直接在数组自身上处理,不用担心覆盖原本的元素,因为我们是从数组0索引开始遍历的元素,要覆盖的元素(不管是0还是非0元素)都已经先行一步被赋值到了对应位置。

———-C
好,下面我们来看一下AC的代码:

void moveZeroes(int* nums, int numsSize) {  int pos = 0;  for(int i = 0; i < numsSize; ++i){    //nums[]    if(nums[i]){      nums[pos++] = nums[i];    }  }  for(int i = pos; i < numsSize; ++i){    nums[i] = 0;  }}
0 0
原创粉丝点击