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

本文介绍了一种算法,用于将整数数组中的所有奇数移动到前面,所有偶数移动到后面,同时保持相同奇数或偶数之间的相对顺序不变。提供了三种解决方案:使用双指针不保证稳定性、使用插入排序保证稳定性以及使用双指针但额外消耗空间的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

示例:

输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

JAVA
双指针

class Solution {
    //双指针, 从前至后一个,从后至前一个
    public int[] exchange(int[] nums) {
         int front=0;
        int back=nums.length-1;
        while(front<back){
            while(front<back && nums[front]%2!=0)
                front++;
            while (front<back && nums[back]%2==0)
                back--;
            if(front<back){
                int temp=nums[front];
                nums[front]=nums[back];
                nums[back]=temp;
            }
        }
        return nums;                                               
    }
}

再加个要求: 要求保持稳定,即数字间的前后顺序不变

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型一维数组 
     * @return int整型一维数组
     */
    //如果不保证顺序就可以用双指针了, 这里类似于排序是否稳定,已知插入排序是稳定的
    //所以用插入排序,  前边奇数区为有序区,挨个遍历后续数组
    public int[] reOrderArray (int[] array) {
        // write code here
       if(array==null&&array.length==0)  return array;
        int pre=0;//上一个奇数出现的未知
        int temp=0;
        for(int i=0;i<array.length;i++){
            temp=array[i];
            if(array[i]%2==0)
                continue;
            int k=i;
            while(k>pre){
                array[k]=array[k-1];
                k--;
            }
            array[k]=temp;
            pre++;
        }
        return array;
    }
}

试试双指针,但是需要浪费点空间

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型一维数组 
     * @return int整型一维数组
     */
    //双指针
    public int[] reOrderArray (int[] array) {
        // write code here
        int []array1=new int[array.length];
        int l=0;
        int r=array.length-1;
        int index_l=l;
        int index_r=r;
        while(l<array.length && r>=0)
        {
            if(array[l]%2==1){
                array1[index_l++]=array[l];
            }
            l++;
            if(array[r]%2==0){
                array1[index_r--]=array[r];
            }
            r--;
        }
        return array1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值