牛客网——剑指Offer JZ13(JAVA)

牛客网的一道题

题目

调整数组顺序使奇数位于偶数前面

题目描述:

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

第一种方法:辅助数组

创建两个新的数组 jarray 与 oarray 分别存储数组中的奇数与偶数,最后再将两个数组按照奇数在前,偶数在后合并起来。

    //第一种方法
    //新建两个数组,一个存放奇数一个存放偶数,最后合并

    public void reOrderArray(int [] array) {
		//创建两个辅助数组
        int[] jarray = new int[array.length];
        int[] oarray = new int[array.length];
        //记录奇数与偶数的个数
        int jnew = 0;
        int onew = 0;
        //遍历数组,将奇数与偶数分别存储到两个数组中
        for (int i = 0; i < array.length;i++){
            if (array[i] % 2 == 0){
                oarray[onew] = array[i];
                onew++;
            }else{
                jarray[jnew] = array[i];
                jnew++;
            }
        }
        //将奇数数组 jarray 中的元素添加到原数组
        for (int j = 0;j < jnew;j++){
            array[j] = jarray[j];
        }
        //将偶数数组 oarray 中的元素添加到原数组奇数的后面
        for (int o = 0;o < onew;o++){
            array[jnew + o] = oarray[o];
        }
    }

第二种方法:双指针法

指针 o 指向从左向右第一个偶数,,指针 j 不断向后搜索
当指针 j 所指为偶数时,继续向后搜索,当指针 j 指向奇数时,从指针 o 到 j 之间的所有偶数与指针 j 指向的奇数换位置,直到指针 j 将数组搜索完毕
图示

//第二种方法
    //双指针法
    //指针o  指向从左向右第一个偶数,,指针j 不断向后搜索
    //当指针j所指为偶数时,继续向后搜索,当指针j指向奇数时,从指针o到j之间的所有偶数与指针j指向的奇数换位置,直到指针j将数组搜索完毕
        public void reOrderArray(int [] array) {
			//定义两个指针引用
            int o = 0;
            int j = 0;
			// j 搜索完整个数组时停止
            while(j < array.length){
            //如果 j 指向奇数,,将 o (包括o)到 j 之间的偶数向后移动
            //将 j 指向的奇数 放到 o 处 
                if (array[j] % 2 != 0){
                    for (int i = j;i > o;i--){
                        int temp = array[i];
                        array[i] = array[i-1];
                        array[i-1] = temp;
                    }
                    o++;
                    j++;
                }else{   // j 指向奇数时,跳过继续向后搜寻
                    j++;;
                }
            }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值