链接:https://www.nowcoder.com/practice/beb5aa231adc45b2a5dcc5b62c93f593
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:时间换空间,另开一个数组保存偶数,扫描原数组,把偶数存入临时数组中,并把奇数向左移动,最后把临时数组中的偶数重新放到原数组尾部。
举例
原数组{3,4,5,7,8,2,9}
刚开始是这样:
从左往右扫描,第一个数是3,奇数,把3放入到插入指针处(其实就是原地),然后把插入指针往右移动,扫描指针也往右移动。
于是:
现在扫描到4,是偶数,把它放入临时数组,并把扫描指针右移。
于是:
现在扫描到5,是奇数,把5放到插入指针处,然后把插入指针往右移动,扫描指针也往右移动。
于是:
扫描到7,是奇数,把7放到插入指针处,然后把插入指针往右移动,扫描指针也往右移动。
于是:
现在扫描到8,是偶数,把它放入临时数组,并把扫描指针右移。
于是:
再然后:
最后:
至此,已经完成了奇数左移和偶数选出。
接下来把临时数组的偶数放入原数组即可。
代码
1 /** 2 * @author yuan 3 * @version 0.1 4 * @date 2019/6/6 5 */ 6 public class ReOrderArray { 7 8 public static void print(int[] array) { 9 for (int i = 0; i < array.length; i++) { 10 System.out.print(array[i]); 11 if (i == array.length - 1) { 12 System.out.println(); 13 } else { 14 System.out.print(" "); 15 } 16 } 17 } 18 19 public static void reOrderArray(int[] array) { 20 // 保存偶数 21 int[] temp = new int[array.length]; 22 // 当前偶数数量 23 int count = 0; 24 // 当前填入位置,第一轮for循环用于奇数左移,第二轮用于填入偶数 25 int pos = 0; 26 for (int i = 0; i < array.length; i++) { 27 if ((array[i] & 1) == 0) { 28 temp[count++] = array[i]; 29 } else { 30 array[pos++] = array[i]; 31 } 32 } 33 for (int i = 0; i < count; i++) { 34 array[pos++] = temp[i]; 35 } 36 } 37 38 public static void main(String[] args) { 39 int[] array = new int[]{3, 4, 5, 7, 8, 2, 9}; 40 print(array); 41 reOrderArray(array); 42 print(array); 43 } 44 }