剑指offer_ 调整数组顺序使奇数位于偶数前面

题目描述

需要保证奇数和奇数,偶数和偶数之间的相对位置不变

解题思路

方法一:超级暴力,创建一个新数组,遍历原数组,如果是偶数写进去,遍历第二次原数组如果是奇数写进去,最后第三次遍历赋值原数组,时间复杂度应该是3n,空间复杂度是n

 1 public class Solution {
 2     public void reOrderArray(int [] array) {
 3         int newArray[]=new int[array.length];
 4         int l=0;
 5         for(int i=0;i<array.length;i++){
 6             
 7             if(array[i]%2!=0){
 8                 newArray[l++]=array[i];
 9             }
10         }
11         for(int i=0;i<array.length;i++){
12             if(array[i]%2==0){
13                 newArray[l++]=array[i];
14             }
15         }
16         for(int i=0;i<array.length;i++)
17         {
18             array[i]=newArray[i];
19             
20         }
21     }
22 }

方法二

创建原数组的copy数组,先遍历一遍数组奇数个数,然后两次赋值

 1 public class Solution {
 2     public void reOrderArray(int [] array) {
 3         int newArr[]=array.clone();
 4         int num=0;
 5         int j=0;
 6         for(int i=0;i<array.length;i++){
 7             if(array[i]%2!=0) num++;
 8         }
 9         for(int i=0;i<newArr.length;i++){
10             if(newArr[i]%2!=0) array[j++]=newArr[i];
11             else array[num++]=newArr[i];
12         }
13     }
14 }

方法三

使用冒泡思想,每次都当前偶数上浮到当前最右边。时间复杂度 O(N2 ),空间复杂度 O(1),时间换空间。

 1 public void reOrderArray(int[] nums) {
 2 int N = nums.length;
 3 for (int i = N - 1; i > 0; i--) {
 4 for (int j = 0; j < i; j++) {
 5 if (isEven(nums[j]) && !isEven(nums[j + 1])) {
 6 swap(nums, j, j + 1);
 7 }
 8 }
 9 }
10 }
11 private boolean isEven(int x) {
12 return x % 2 == 0;
13 }
14 private void swap(int[] nums, int i, int j) {
15 int t = nums[i];
16 nums[i] = nums[j];
17 nums[j] = t;
18 }

 

posted @ 2019-08-25 10:12  chyblogs  阅读(125)  评论(0)    收藏  举报