题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
实现思路
大概思路如下图:
由图可知,数组的第一个位置就是0,根据题目要求我们要将它移动到数组的末尾。这里采用的是将数组里的元素(从0的位置开始)进行两两比较,如果0的下一个位置上的数非零,那么就将0与下一个位置上的数互换,换完后的位置上的0再与下一个位置上数进行比较,如果下一个位置上是非零就再互换位置,直到0被换到数组的末尾位置。这里循环4次,将数组里第一个位置上的0换到了数组的末尾。
那么数组中第一个0被换到了末尾,还剩一个0,如图:
这个思路也是一样的,要注意此时只要循环三次,因为已经有一个0到了末尾,那么就是数组里的元素逐个进行判断:如果是0就与下一个元素换位置,直到换到数组末尾。显然要使用嵌套for循环(两层),图片所示为内层循环,外层循环只要循环数组的长度次就行了。
完整代码如下:
import java.util.Arrays;
/**
* @author link
* @date 2021/6/7 - 10:53
*/
public class MoveZero {
public static void main(String[] args) {
int []nums={0,1,0,3,12};
new MoveZero().move(nums);
}
private void move(int[] nums) {
int temp;//用来储存交换的元素
for (int i = 0; i <nums.length ; i++) {//数组里的每个数都进行判断因此外层循环次数为数组的长度次
for (int j = 0; j < nums.length - i - 1; j++) {//因为外层循环完每完成一次就有一个0到了数组末尾,因此可以少换一次位置,循环次数就少一次
if (nums[j] == 0 && nums[j + 1] != 0) {//0的下一个位置上的数任然是0,这就没必要再换位置了,因此为了提高效率加上 nums[j + 1] != 0
//交换位置
temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(nums));//输出最终数组
}
}
注意事项
1.因为有可能0的下一个位置上的数任然是0,这就没必要再换位置了,因此为了提高效率加上 nums[j + 1] != 0,如果满足这个条件就互换位置。
2.这里交换的原则选择使用第三方变量,先使用变量temp储存nums[j] (就是0元素),再将nums[j+1] (0下一个位置上的元素)赋值给nums[j],此时0元素就被下一个位置上的元素替换了,再将之前储存的temp赋给nums[j+1] 此时就完成了交换。
这个方法效率上应该不如别的方法好,还有待改进,欢迎各位大佬指点,讨论。只是针对这道题有不同的方法与思路。