6.Move Zeroes

leetcode中的原题目如下:

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:

  1. You must do this in-place without making a copy of the array.
  2. Minimize the total number of operations.
分析:题目的意思就是给定一个数组,要求是把所有为0的数字放到数组的最后,并且要求非0数字的相对位置不发生变化。

方法一:用first0永远保持的是数组中目前第一个0元素的下标,然后从这个下标之后遍历数组,遇到非0的元素则和0进行交换即可。

 public void moveZeroes(int[] nums) {
		 
	        int first0 = -1;
	        int length = nums.length;
	        int temp;
	        
	        for(int i=0;i<length;i++){
	        	if(nums[i]==0 ){
	 	        	first0 = i;//找到记录的是第一个0的位置
	 	        	break;
	        	}
	        }
	        
	        if(first0 == -1 || first0 == length-1){
	        		return;
	        }else{
	        	for(int i=first0;i<length;i++){
	        		if(nums[i]!=0 && first0!=i){
	        			temp = nums[i];
	        			nums[i] = nums[first0];
	        			nums[first0] = temp;
	        			first0++;
	        			
	        		/*	nums[first0] = nums[i];
	        			nums[i]=0;*/
	        			
	        		}
	        	}
	        }
	    }

方法二:保证nums[0..pos]中保存的是按照相对位置存储的非0元素。最后pos后的元素都设为0

 public void moveZeroes2(int[] nums) {
		 
	        int pos=-1;
	        int length = nums.length;
	       
	        	for(int i=0;i<length;i++){
	        		if(nums[i]!=0){
	        			pos++;
	        			nums[pos]=nums[i];
	        		}
	        	}
	        	for(pos=pos+1;pos<length;pos++){
	        		nums[pos]=0;
	        	}
	    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值