奇偶数组分割,原地进行

博客探讨了如何在不创建新空间的情况下,通过原地交换将整数数组分割成奇数在前,偶数在后的排列。介绍了使用类似选择排序的方法,以及利用异或和加减操作实现原地交换的技巧。

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

分割一个整数数组,使得奇数在前偶数在后。

给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]。

1.原地分割,不开辟新的空间,使用类似于选择排序的方式,用一个奇数指针记录当前奇数组结束为止,另外一个选择指针从后面的未分割数组中选出奇数并进行交换,然后将奇数指针后移一位
2.原地交换的两种方式
异或

int a = 10;
int b = 20;
a = a^b;
b = b^a;
a = a^b;

和差

int a = 10;
int b = 20;
a = a + b;
b = a - b;
a = a - b;

public class Solution {
    /**
     * @param nums: an array of integers
     * @return: nothing
     */
    public void partitionArray(int[] nums) {
        // write your code here;
        int k = 0;
        int i = 0;
        //首个偶数
        for(i = 0; i < nums.length; i++)
        {
            if(nums[i] % 2 == 0)
            {
                k = i;
                break;
            }
        }
        //选择并交换
        for(i = k + 1; i < nums.length; i++)
        {
            if(nums[i] % 2 != 0)
            {
                nums[i] = nums[i] ^ nums[k];
                nums[k] = nums[k] ^ nums[i];
                nums[i] = nums[i] ^ nums[k];
                k++;
            }
        }
    }

    //原地交换
    // public void swap(int a,int b)
    // {
    //     a = a^b;  
    //     b = b^a;  
    //     a = a^b; 
    // }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值