🍜一题算法题
题目:
给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序
方法一:
暴力解法:直接创建一个数组接受对象,循环原数组,零元素直接跳过,其余直接赋给新的数组即可
- 假设原数组:int[] num={0,0,0,1,0,3,12,0,};int[] num1={1,2,30,0,0,0,1,2,3};
public class Test01 {
public static void main(String[] args) {
int[] num={0,0,0,1,0,3,12,0,};
Test01.method(num);
int[] num1={1,2,30,0,0,0,1,2,3};
Test01.method(num1);
}
public static void method(int[] num){
if(num.length==0||num==null){
throw new IllegalArgumentException("数组不能为空");
}
int[] newNum=new int[num.length];
int isNullPiont=0;
for (int i = 0; i < num.length; i++) {
if(num[i]!=0){//当值为零时直接跳过
newNum[isNullPiont++]=num[i];
}
}
System.out.println(Arrays.toString(num));
System.out.println(Arrays.toString(newNum));
}
}
方法二 :
双指针解法:定义两个指针 index1 和index2 ,两个指针同时指下标为0,index1还是遍历整个数组,但index2则是在num[index1]!=0的时候进行num[index2]=num[index1];并index2+1;当num[index1]==0时,则直接跳过。(这个做法节省了创建新数组,直接在原数组上进行调动)。
public class Test02 {
public static void main(String[] args) {
//定义两个指针 index1 和index2 如果遍历数组num[index1]
int[] num={0,0,0,1,0,3,12,0,};
Test01.method(num);
int[] num1={1,2,30,0,0,0,1,2,3};
Test01.method(num1);
}
public static void method(int[] num){
if(num.length==0||num==null){
throw new IllegalArgumentException("数组不能为空");
}
int inde2=0;
for (int index1 = 0; index1 < num.length; index1++) {
if(num[index1]!=0){
num[inde2++]=num[index1];
}
}
for (int i = inde2; i <num.length ; i++) {
num[i]=0;
}
System.out.println(Arrays.toString(num));
}
}
方法三:对双指针优化,还没来及看