算法题 奇数位放奇数偶数位放偶数

今天面试遇到这样一道题,一个长度为2n的整数数组,里边有n个奇数n个偶数但是无序,要求奇数位放奇数偶数位放偶数  

结题思路:
采用双指针分别记录奇数位和偶数位,当偶数位的值错误的时候如果奇数错误的index不为空则交换数值,如果为空则将index记录下来。奇数同理
public static void main(String[] args) {
    sort(new int[]{1, 1, 1, 1, 2, 2, 2, 2});
}
//方法一
public static int[] sortJO(int[] array) {
        int jIndex = 1;
        int oIndex = 0;
        while (jIndex < array.length || oIndex < array.length) {
            //循环直到找到需要移动的位置或是直接到最后
            while (oIndex < array.length && array[oIndex] % 2 == 0) {
                oIndex += 2;
            }
            while (jIndex < array.length&& array[jIndex] % 2 == 1) {
                jIndex+=2;
            }
            if (oIndex < array.length&&jIndex<array.length){
                int temp = array[jIndex];
                array[jIndex] =array[oIndex];
                array[oIndex] = temp;
            }
        }
        return array;
    }



//方法二
public static void sort(int[] nums) {
    int o = 0;//偶数index
    int j = 1;//奇数index
    int error_j = -1;//存放错误基数的index
    int error_o = -1;//存放错误偶数的index
    while (o < nums.length || j < nums.length - 1) {
        if (nums[o] % 2 == 0) {
            if (o < nums.length) o += 2;
        } else {
            if (error_j != -1) {
                int temp = nums[error_j];
                nums[error_j] = nums[o];
                nums[o] = temp;
                error_j = -1;
                if (o < nums.length) o += 2;
            } else {
                error_o = o;
            }

        }
        if (nums[j] % 2 == 1) {
            if (j < nums.length - 1) j += 2;
        } else {
            if (error_o != -1) {
                int temp = nums[error_o];
                nums[error_o] = nums[j];
                nums[j] = temp;
                error_o = -1;
                if (j < nums.length - 1) j += 2;
            } else {
                error_j = j;
            }
        }
        print(nums);
    }

}

输出结果:

1 1 1 1 2 2 2 2 
1 1 1 1 2 2 2 2 
2 1 1 1 2 1 2 2 
2 1 1 1 2 1 2 2 
2 1 2 1 2 1 2 1 
2 1 2 1 2 1 2 1 
2 1 2 1 2 1 2 1 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值