您的当前位置:首页正文

算法Java:将数组内所有0移动到数组末尾

2024-11-19 来源:个人技术集锦


实现思路

这个算法可以将数组中的所有值为0的元素移到数组末尾。他是如何实现的呢?这里我们主要考虑两种解决方案。第一种思路比较简单直接。他是这样的:将所有不等于0的元素通过修改索引的方式移动到前面。然后我们用数组的最大索引减去这个元素值为非0的累加索引就得到了0的数量。接下来我们使用循环把0添加到累加索引的后面即可。

第二种思路就是交换元素的思路。这个思路比较新奇。他是这样的。我们使用两个变量i, j作数组arr索引,j作循环变量。当arr[j]不为0的时候,我们就交换arr[i],arr[j]元素,同时i自增1。这样就能能把所有0移到数组的最后面。其实不只是0,对于任意实数,这种方法都可以把该实数移到数组的最后面,除非数组不包含该实数。那这种方法为什么成立呢?我们举一个例子,设数组arr={1,0,0,3}。1: arr[0]<->arr[0], i+=1, 此时arr={1,0,0,3}.  2: j+=1  3:j+=1  4: j+=1,arr[3]<->arr[1],i+=1, 循环结束,此时arr={1,3,0,0}。我们这里只演示一种情况,对于其他情况,大家可以自行debug单步调试去分析过程,这里就不再赘述。


代码展示

package advance.algorithm;

public class Move0s {
	public static void solution1(int[] nums) {
		if (nums == null || nums.length == 0)
			return;
		int index = 0;
		for (int i = 0; i < nums.length; i++) {
			if (nums[i] != 0)
				nums[index] = nums[i];
                index++;
		}
		while (index < nums.length) {
			nums[index] = 0;
            index++;
		}
	}

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

	public static void main(String[] args) {
		int[] arr = { 1, 0, 4, 0, 2, 6 };
		solution2(arr);
		for (int e : arr)
			System.out.println(e);
	}
}

显示全文