这个算法可以将数组中的所有值为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);
}
}