题目描述:
给定一个数组,在不申请新数组的情况下,把数组中非零元素稳定的放到数组前面,零元素放到数组后面。稳定就是非零元素的相对位置不要发生改变。题目很简单,水一下博客。
解题方案:
第一种方法,就是类似如插入排序的方法,遍历数组,如果遇到非零元素就将其向前移动,移动至前面的元素不为0或至数组顶端为止
第二种方法,操作更少,用一个从零开始的辅助下标,遍历数组,如果遇到非零元素就将其赋给辅助下标的位置,然后辅助下标加加。
代码:
import java.util.Scanner;
public class FirstQues {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt();
int[] primaryArr = new int[num];
for(int i=0; i<num; i++){
primaryArr[i] = in.nextInt();
}
// settleArr1(primaryArr);
settleArr2(primaryArr);
for(int q=0; q<primaryArr.length; q++){
System.out.print(primaryArr[q] + " ");
}
}
public static void settleArr1(int[] primaryArr){
boolean flag=false;
for(int x=1; x<primaryArr.length; x++){
// 如果x这个位置的值不为0
if(primaryArr[x]!=0){
// 且前面有0存在,则要把当前位置向前移动,直到不为0或到数组顶部
for(int j= x-1; primaryArr[j]==0 && j>=0; j--){
primaryArr[j] = primaryArr[j+1];
// 当前位置向前移动了,那么此位置就要补为0
primaryArr[j+1] = 0;
// 如果j为0,就不能减减了,不然会数组越界
if(j==0) break;
}
}
}
}
public static void settleArr2(int[] primaryArr){
int index =0;
for(int i =0 ; i<primaryArr.length; i++){
if(primaryArr[i]!=0){
primaryArr[index]= primaryArr[i];
if(index != i)
primaryArr[i] = 0;
index++;
}
}
}
}
测试结果: