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

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:

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

void moveZeroes(int* nums, int numsSize) {
    int j;
    for(int i=0;i<numsSize;i++){
        if(nums[i]==0)
            for(j=i+1;j<numsSize;j++)
                if(nums[j]!=0){
                    nums[i]=nums[i]^nums[j];
                    nums[j]=nums[i]^nums[j];
                    nums[i]=nums[i]^nums[j];
                    break;
                }
    }
}

思考方法:从第一个元素开始扫描,为零就后移,并于后面的非零元素交换值,补充一点用异或的原因是才会,练下手。这样运算的复杂度为O(n^2),比较复杂。
看下别人的代码就看出区别来了。

void moveZeroes(int* nums, int numsSize) {
    int i,len=0;
    for(i=0;i<numsSize;i++){
        if(nums[i]!=0){
            nums[len]=nums[i];
            len++;
        }
    }
    for(i=len;i<numsSize;i++)
        nums[i]=0;
}

这种方式每次扫描就把非零数字全部集合在一起,剩下的就为0,其实在往更深的地方想也能想到,究其原因,还是思想深度不够,没能看透其本质。

收藏 打印