题目:
给定一个数组
nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。**请注意** 必须在不复制数组的情况下原地对数组进行操作。
输入:
[0,2,5,6,1,0]
输出:
[2,5,6,1,0,0]
解题思路1:
1. 首先最简单的思路就是通过循环遍历,在遍历的途中如果遇到了 0 这个时候将0和它所遇到第一个非0的数字进行位置交换。
2. 通过双层for循环即可实现
public class Test01{
public static void main(String[] args){
int[] arr = {0,2,3,0,4,0,0,8};
System.out.println(Arrays.toString(method(arr)));
}
public static int[] moveZeros(int[] arr){
if (arr==null) return null;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j <i ; j++) {
if (arr[j]==0){ // 进行元素的调换
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
}
解题思路2: 优化后的代码
1. 我们还是需要两个指针,但是我们可以通过单层循环进行遍历。当遍历到最后一个非零数字之后结束循环
2.第二个遍历将后面的所有数据全部置为0
public class Test1{
public static void main(String[] args){
int[] arr = {0,2,3,0,4,0,0,8};
System.out.println(Arrays.toString(moveZeros(arr)));
}
private static int[] moveZeros(int[] arr) {
int index = 0; // 临时指针。 我这个指针从0开始
for (int i = 0; i < arr.length; i++) {
if(arr[i] != 0) {
arr[index] = arr[i];
index++;
}
}
while(index < arr.length) {
arr[index] = 0;
index++;
}
retrun arr;
}
}