剑指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 }

浙公网安备 33010602011771号