题目练习:调整数组顺序使奇数位于偶数前面(二)

本文介绍了如何通过双指针法在O(n)的时间复杂度和O(1)的空间复杂度下,将一个整数数组重新排序,使得所有奇数位于数组前面,偶数位于数组后面。具体实现是设置两个指针,一个从左向右寻找偶数,一个从右向左寻找奇数,找到后交换它们的位置。这种方法避免了数组越界问题,且只需常数级额外空间。
摘要由CSDN通过智能技术生成

目录

题目

思路

解决方案

总结


题目

        输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,对奇数和奇数,偶数和偶数之间的相对位置不做要求,但是时间复杂度和空间复杂度必须如下要求。

 

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

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

思路

        双指针遍历,从数组两头向中间靠近。左边的为奇数指针 i ,右边的为偶数指针 j 。

         i 在没有遇到偶数时,就向右移动,遇到偶数立即停止; j 再没有遇到奇数时,向左边移动,遇到奇数时,进行奇偶指针元素交换,交换之后切换到奇数指针工作。全程i < j。

解决方案

public class Test {
   public static int[] reOrderArrayTwo(int[] array) {
        int i = 0;                 //奇数指针
        int j = array.length - 1;  //偶数指针
        while (i < j) {        //当 i>= j 时,左右两侧都已遍历。结束循环
            while (i < j && array[i] % 2 == 1) { // i ,遇到奇数跳过,指向偶数
                i++;
            }
            while (i < j && array[j] % 2 == 0) { // j ,遇到偶数跳过,指向奇数
                j--;
            }
            //交换奇数偶数,奇数放到偶数前
            int tmp = array[i];
            array[i] = array[j];
            array[j] = tmp;
        }
        return array;
    }
}

输入数组

[1,3,5,6,7] 和 [1,4,4,3]

输出结果

时间复杂度:o(n),遍历数组一次
空间复杂度:o(1),一个交换数组值的tmp

总结

1.利用双指针双向遍历,可解决数组越界等问题。 

2.在同一数组内交换元素,可以使空间复杂度保持o(1)。

3.题目对于奇数与奇数、偶数与偶数之间相对位置不做要求,故也可以采用题目练习:调整数组顺序使奇数位于偶数前面(一) 的方法。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瘦皮猴117

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值