剑指offer 21:调整数组顺序使奇数位于偶数前面

题目描述:

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

数据范围:0 ≤ n ≤5 000,数组中每个数的值 0 ≤ val ≤ 10000

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

进阶:时间复杂度 O(n^2),空间复杂度 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]

解法:两次遍历。

思路:

定义一个与原数组大小一致的数组,第一次遍历找到原数组中所有奇数存入结果数组中,第二次遍历找到所有偶数存入结果数组中。

代码如下:

import java.util.*;
public class Solution {
    public int[] reOrderArray (int[] array){
        //存储结果的数组
        int[] result = new int[array.length];
        //索引
        int index = 0;
        //找到所有的奇数,放到result中
        for(int i=0; i < array.length; i++){
            if(array[i] % 2 != 0){
                result[index++] = array[i];
            }
        }
        //找到所有的偶数,放到result中
        for(int i=0; i < array.length; i++){
            if(array[i] % 2 == 0){
                result[index++] = array[i];
            }
        }
        //返回结果
       return result;
    }
}

在本题中调整数组顺序过程中强调了要保证奇数和奇数、偶数和偶数之间的相对位置不变。如果说没有这个前提条件的话,可以使用双指针遍历的方式。即:通过left和right两个指针,分别指向数组的起始位置和末尾位置,然后向中间位置靠拢,左指针找到第一个偶数时停止,右指针找到第一个奇数时停止,然后进行交换。代码如下:

    public static int[] reOrderArray (int[] array){
        //左指针指向数组首位置,右指针指向数组末尾位置
        int left = 0, right = array.length-1;
        //临时变量
        int temp;
        while(left < right){
            //当left小于right,并且array[left]为奇数,向后遍历,直到找到第一个偶数
            while(left < right && (array[left] & 1) == 1){
                left ++;
            }
            //当left小于right,并且array[right]为偶数,向前遍历,直到找到第一个奇数
            while(left < right && (array[right] & 1) == 0){
                right --;
            }
            //交换位置
            temp = array[left];
            array[left] = array[right];
            array[right] = temp;
        }
        return array;
    }

猜你喜欢

转载自blog.csdn.net/weixin_47382783/article/details/120901583