给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:

  1. 输入: [0,1,0,3,12]
  2. 输出: [1,3,12,0,0]
  3. 说明:
  4. 必须在原数组上操作,不能拷贝额外的数组。
  5. 尽量减少操作次数。

c语言


  • 将非零前移
    1. void moveZeroes(int* nums, int numsSize){
    2. int index = 0;
    3. for (int i = 0; i < numsSize; i++) {
    4. if (nums[i] != 0) {
    5. nums[index++] = nums[i];
    6. }
    7. }
    8. //数组补零
    9. for (int i = index; i < numsSize; i++) {
    10. nums[i] = 0;
    11. }
    12. }

c plus


  • 循环一次

题解 用慢指针记录零的位置,然后和快指针交换对应的值即可。

  1. class Solution {
  2. public:
  3. void moveZeroes(vector<int>& nums) {
  4. if (nums.size() == 0) return;
  5. int len = nums.size();
  6. int slow = 0; //寻找0的位置,找到后和非零的快指针交换。
  7. for (int i = 0; i < len; i++) {
  8. if (nums[i] != 0) {
  9. if (i > slow) { //相等时没必要交换。// 相当于[0,0]连着了,因为为0时,slow++,i++了,所以相等。
  10. nums[slow] = nums[i];
  11. nums[i] = 0;
  12. }
  13. slow++;//不为0时,继续向后找0的位置,找到后,不再移动
  14. }
  15. }
  16. }
  17. };