题目要求:
设数组A[0,…,n-1]的n个元素中有多个零元素,设计一个算法,将A中所有非零元素依次移动到A数组的前端。
思路:
定义两个下标 ,为 zeroIndex 与 notZeroIndex,zeroIndex 代表从最左边到右边数第一个元素为 0 的下标,notZeroIndex 代表 zeroIndex 之后,第一个元素不为0的下标,然后将两者元素值交换。
重复该操作,直到 zeroIndex 到大数组最后
java:
public class Test2 {
public static void main(String[] args) {
int[] nums = {0,0,1,4,-3,0,6,7,0,0,0,7};
moveZero(nums);
for(int a:nums){
System.out.print(a+"\t");
}
System.out.println();
}
// 给定整数数组,将非零整数保持原相对顺序移到数组的前段,零移到后段,
// 要求不能重新拷贝数组,考虑O(n)时间复杂度实现。
//例如:输入数组为{1,2,0,0,5,6},输出为{1,2,5,6,0,0}。
//
//注:不需要从控制台读取输入,不考虑异常输入,直接实现核心算法,例如实现方法
private static void moveZero(int[] a){
int zeroIndex = 0, notZeroIndex = 0;
while (zeroIndex<a.length&¬ZeroIndex<a.length) {
while (zeroIndex < a.length && a[zeroIndex] != 0) {
zeroIndex++;
}
notZeroIndex = zeroIndex;
while (notZeroIndex < a.length && a[notZeroIndex] == 0) {
notZeroIndex++;
}
swap(a, zeroIndex, notZeroIndex);
zeroIndex++;
notZeroIndex++;
}
}
static void swap(int[] nums, int a, int b) {
int tmp = nums[a];
nums[a] = nums[b];
nums[b] = tmp;
}
}