题目描述:
给定一个数组,在不申请新数组的情况下,把数组中非零元素稳定的放到数组前面,零元素放到数组后面。稳定就是非零元素的相对位置不要发生改变。题目很简单,水一下博客。
解题方案:
第一种方法,就是类似如插入排序的方法,遍历数组,如果遇到非零元素就将其向前移动,移动至前面的元素不为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++; } } } }
测试结果: