题目链接

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

示例

  1. 输入:12345
  2. 输出:13524

解题思路

方法一: 创建一个新数组,时间复杂度 O(N),空间复杂度 O(N)。

  1. public int[] reOrderArray (int[] array) {
  2. int total = 0;
  3. for(int i : array){
  4. // 统计奇数的个数,作为偶数存放的起始索引
  5. if (!isEven(i)) {
  6. total++;
  7. }
  8. }
  9. // 定义在新数组中奇数和偶数的起始索引,奇数起始索引为i,偶数起始索引为j
  10. int i=0,j=total;
  11. int[] newArray = new int[array.length];
  12. for (int num : array){
  13. //是奇数
  14. if(!isEven(num)){
  15. newArray[i++]=num;
  16. }
  17. //是偶数
  18. else {
  19. newArray[j++]=num;
  20. }
  21. }
  22. return newArray;
  23. }
  24. public boolean isEven(int x){
  25. if (x % 2 ==0) {
  26. return true;
  27. }
  28. return false;
  29. }

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

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