【剑指offer】18. 调整数组顺序使奇数位于偶数前面(一)(java)

文章目录

  • 调整数组顺序使奇数位于偶数前面(一)
    • 描述
    • 示例1
    • 示例2
    • 示例3
    • 思路
    • 完整代码

调整数组顺序使奇数位于偶数前面(一)

描述

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

数据范围: 0 ≤ n ≤ 5000 0≤n≤5000 0n5000,数组中每个数的值 0 ≤ v a l ≤ 10000 0≤val≤10000 0val10000

要求:时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)

进阶:时间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度 O ( 1 ) O(1) O(1)

示例1

输入:

[1,2,3,4]

返回值:

[1,3,2,4]

示例2

输入:

[2,4,6,5,7]

返回值:

[5,7,2,4,6]

示例3

输入:

[1,3,5,6,7]

返回值:

[1,3,5,7,6]

思路

一开始最先想到的一个比较笨的方法就是先统计出奇数和偶数的个数i和j,在分别创建数组num1[i]和num2[j]用于记录奇数和偶数数组,最后再创建一个结果数组res[i+j],先将奇数数组赋值,再将偶数数组赋值即可,这样最多只遍历n次,空间复杂度也是 O ( n ) O(n) O(n)

public int[] reOrderArray (int[] array) {
    // write code here
    int n = 0;	//奇数个数
    int m = 0;	//偶数个数
    for (int i = 0; i < array.length; i++) {	//统计奇数和偶数个数
        if (array[i] % 2 == 0) {
            m++;
        } else {
            n++;
        }
    }
    int[] num1 = new int[n];
    int index1 = 0;
    int[] num2 = new int[m];
    int index2 = 0;
    int[] res = new int[n + m];
    for (int i = 0; i < array.length; i++) {	//记录奇数和偶数数组
        if (array[i] % 2 == 1) {
            num1[index1] = array[i];
            index1++;
        } else {
            num2[index2] = array[i];
            index2++;
        }
    }
    int index = 0;
    for (int i = 0; i < n; i++) {		//对返回数组赋值
        res[index] = num1[i];
        index++;
    }
    for (int i = 0; i < m; i++) {
        res[index] = num2[i];
        index++;
    }
    return res;
}

实际上上述代码还能优化一下,因为数组中只有两种数,前面是奇数,后面是偶数。所以只需统计奇数的个数,偶数的个数就能知道。当遍历数组时,如果是奇数,则从0开始给返回数组赋值,如果是偶数,则从奇数个数+1处开始赋值

int len = array.length;
int[] res = new int[len];
int n = 0;
for (int i = 0; i < len; i++) {		//统计奇数个数
    if (array[i] % 2 == 1) {
        n++;
    }
}
int index1 = 0, index2 = n;			//奇数从0开始,偶数从n开始
for (int i = 0; i < len; i++) {
    if (array[i] % 2 == 1) {
        res[index1++] = array[i];
    } else {
        res[index2++] = array[i];
    }
}
return res;

题目说的时间复杂度为 O ( n 2 ) O(n^2) O(n2)的解法,我参考了一下别人的,使用的类似于冒泡排序的方法

for (int i = 0 ; i < array.length - 1 ; i ++) {
    for (int j = 0 ; j < array.length - 1 - i ; j ++) {
        if (array[j] % 2 == 0 && array[j + 1] % 2 != 0) {
            int temp = array[j] ;
            array[j] = array[j + 1] ;
            array[j + 1] = temp ;
        }
    }
}
return array ;

主要思路很简单,就是类似于冒泡排序,将序列从0开始增长,每次增长时最后一个元素会和下一个元素比较,如果是偶数和奇数则调换位置,这样不断循环就会使得奇数的位置一直往前移动,但是当两个奇数相遇时不会移动,就可以保持奇数和偶数的相对顺序不变

完整代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param array int整型一维数组
     * @return int整型一维数组
     */
    public int[] reOrderArray (int[] array) {
        // write code here

        for (int i = 0 ; i < array.length - 1 ; i ++) {
            for (int j = 0 ; j < array.length - 1 - i ; j ++) {
                if (array[j] % 2 == 0 && array[j + 1] % 2 != 0) {
                    int temp = array[j] ;
                    array[j] = array[j + 1] ;
                    array[j + 1] = temp ;
                }
            }
        }
        return array ;
    }
}

你可能感兴趣的:(剑指offer,java,算法,python)