题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
示例1
输入:
[1,2,3,4]
返回值:
[1,3,2,4]
示例2
输入:
[2,4,6,5,7]
返回值:
[5,7,2,4,6]
题目思想:
所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分
保证原有的次序,则只能顺序移动或者相邻交换
方法一:暴力法
遍历数组找到奇数的位置,然后使原来的数组整体向后移
代码如下:
//使用插入排序的思想 public int[] reOrderArray (int[] arr){ if(arr==null||arr.length==0){ return arr; } int j=0;//记录已经是奇数的位置 int temp = 0; for(int i =0;i<arr.length;i++){ temp = arr[i]; //若是偶数则跳过进行下一次循环 if(arr[i]%2==0){ continue; }else{ int k =i; while(k>j){ arr[k] = arr[k-1];//这区间整体向后移动一位 k--; } arr[k] = temp; j++; } } return arr; }
时间复杂度:O(n^2),因为找到每个奇数,都需要移动数组里的元素,所以他的时间复杂程度比较复杂
方法二:优化解
遍历数组,统计奇数和偶数的个数统计出来并临时存放,在新数组中先放奇数再放偶数
代码如下:
public int[] reOrderArray (int[] arr) { int oddCount = 0, evenCount = 0; int[] newArr = new int[arr.length]; // 统计原数组中奇数的个数 for (int i = 0; i < arr.length; i++) { if((arr[i] & 1) == 1){ oddCount++; } } //统计原数组中偶数的个数 for (int i = 0; i < arr.length; i++) { if((arr[i] & 1) == 1){ // 在新数组中,先放奇数,从头开始放 newArr[evenCount++] = arr[i]; }else{ // 偶数从奇数总个数后开始放 newArr[oddCount++] = arr[i]; } } for (int i = 0; i < arr.length; i++) { arr[i] = newArr[i]; } return arr; }
时间复杂度:O(n),其中n是数组中元素个数