问题描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
解题思路:
解法一:使用冒泡排序的方法将所有0移动到后面。
&emps; 解法二:遍历两次数组,第一次先将所有的非零数移动到前面,即先前靠拢;第二次遍历将数组末尾多余出来的位置赋值为零。
代码实现:
/**
* 冒泡排序解法
* @param nums
*/
public static void moveZeroes(int[] nums) {
int j = nums.length - 2;
//从后向前遍历,寻找0
while(j>=0){
if(nums[j]==0){
//找到零后使用类似于冒泡排序的方法将零移动到最后、
int i=j;
//注意 i<nums.length-2 要放在前面,防止数组越界
while (i<=nums.length-2 && nums[i+1] != 0) {
int t = nums[i];
nums[i] = nums[i+1];
nums[i+1] = t;
i++;
}
}
j--;
}
}
/**
* 两次遍历的解法
* @param nums
*/
public static void moveZeroes2(int[] nums) {
int j = 0; //用于记录非零结尾位置,即临界值
//第一次遍历将所有的非零值都移动到前面
for(int i=0; i<nums.length; i++){
if(nums[i] !=0 ){
nums[j] = nums[i];
j++;
}
}
//第二次遍历将将末尾多出的位置都赋值为零
for(int i=j; i<nums.length; i++){
nums[i] = 0;
}
}
冒泡排序解法的提交结果:
两次遍历解法的提交结果: