leetcode 283. Move Zeroes

283.Move Zeroes
Description:
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.

Example:
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

Note:
1.You must do this in-place without making a copy of the array.
2.Minimize the total number of operations.

这道题是要将所有的0移到数组后面。
我的思路是先找出数组中有多少个0,然后两层for循环,外层循环总共执行0的个数次,每一次都将数组中的一个0(从左往后)移到最后。总的思路就是将0往后移。

class Solution {
    public void moveZeroes(int[] nums) {       
        int n = 0;
        for(int i=0;i<nums.length;i++){  //记录0的个数,即外层循环执行次数
            if(nums[i]==0)
                n++;
        }                       
        for(int i=0;i<n;i++){    
        	int a = 0;  //用a来记录数组中为0的数的索引
        	while (nums[a]!=0) {
				a++;	
			}
           for(int j=a+1;j<nums.length;j++){   //把0移到最后
               int temp = nums[a];
               nums[a]=nums[j];
               nums[j]=temp;
               a++;
            }                	
        }
    }
}

然后在网上看到一位博主的更好方法:参考链接
总体思路是:把非零的数都移到左边。这和我的思路正好相反,这样更是方便了(今后要适当加点营养了…)博主在其文章中说到用的是双指针,前面的指针指向处理过的最后一个非零数字, 后面一个指针向后扫,遇到非零数字则换到前面,前面指针后移1位,最后统一把后面的全部变成0。
这样看来我上面所用的方法也是用了双指针。。

public class Solution {
    public void moveZeroes(int[] nums) {
        int index = 0;  //“前面的指针”一直保持在i的后面或与其同步,index是连续的
        for (int i = 0; i < nums.length; ++i) {  //i用来寻找非零数的指针 
            if (nums[i] != 0) {
                nums[index++] = nums[i];  //将非零数前移
            }
        }
        for (int i = index; i < nums.length; ++i) {   //最后统一为0
            nums[i] = 0;
        }
    }
}

还有一种看起里更加简洁的方法:

class Solution {
    public void moveZeroes(int[] nums) {
    int j = 0;
    for(int i = 0; i < nums.length; i++) {
        if(nums[i] != 0) {
            int temp = nums[j];
            nums[j] = nums[i];
            nums[i] = temp;
            j++;
        }
    }
}
}

其实这个方法的思路与第二种方法一致,都是把非零数往前移,区别在于把非零数往前移的方式不同,前者是直接移,最后统一归零,现在这个是把i指针所指的非零数与前面的指针j所指的数交换,这样0就自然移到了最后边。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值