- 首页 > it技术 > >
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
public class Demo1 {
public static void main(String[] args) {
int[] a = { 0, 0, 0, 11, 23 };
int[] b = { 0, 0, 0, 11, 23 };
int[] c = { 0, 0, 0, 11, 23 };
System.out.println("******方法一*******");
sortZero1(a);
for (int n : a)// 增強for循环,遍历数组a的每一个元素依次赋值给n
System.out.print(n + " ");
System.out.println();
System.out.println("******方法二*******");
sortZero2(b);
for (int n : b)
System.out.print(n + " ");
System.out.println();
System.out.println("******方法三*******");
sortZero3(c);
for (int n : c)
System.out.print(n + " ");
} public static void sortZero1(int a[]) {//方法一
/*
* 思路:1.从数组中找到第一个元素值为0的下标,再找从该0元素之后的第一个不为0的元素下标,在进行交换
*如:0,0,0,5,6 第一个0与5交换
*
*2.依次进行1操作,直到0后不再有非0值停止
*/
for (int i = 0;
i < a.length;
i++) {
if (a[i] == 0) {
int b = i + 1;
//从当前i之后开始查询第一个不为0的元素
while (b < a.length) {
if (a[b] != 0) {
a[i] = a[b];
a[b] = 0;
break;
//交换完毕跳出while循环
} else
b++;
}
if (b == a.length)//0后不再有非0值结束循环
break;
}
}
} public static void sortZero2(int a[]) {
int count = 0;
//记录0的个数
int j;
for (int i = 0;
i < a.length - count;
i++) {//0后移之后判断长度相应的减去0的个数if (a[i] == 0) {
count++;
for (j = i;
j < a.length - 1;
j++) {//查到0元素后,0之后元素依次进行前移
a[j] = a[j + 1];
}
a[j] = 0;
//前移后最后值赋0
i--;
//前移后再对当前的i重新判断是否为0,防止有连续0出现
}
}
}public static void sortZero3(int a[]) {//同学写的 很优秀 自行体会
for (int i = 0;
i < a.length - 1;
i++){
for (int j = i;
j < a.length - 1;
j++)
if(a[i]==0]){
a[i]=a[i]^a[j+1];
a[j+1]=a[i]^a[j+1];
a[i]=a[i]^a[j+1];
}}
}
}
推荐阅读