剑指offer笔记// 13·调整数组顺序使奇数位于偶数前面

该博客介绍了如何调整一个整数数组,使得所有奇数位于数组前半部分,偶数位于后半部分,同时保持奇偶数间的相对位置不变。通过设置两个游标i和j,当i指向偶数时,j右移到下一个奇数,然后将j指向的奇数移到i前面。文章提供了详细的思路和代码实现。
摘要由CSDN通过智能技术生成

题目描述

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

归类:数组,筛选

思路

1·排除特殊情况:数组长度为0 or 不存在
if(array==null || array.length ==0)
2·(思路)需要给出初始、判断循环、终止

  • 两个游标i,j相邻,j = i+1
  • i后移,i为偶数时,j右移,j指向奇数时,将j所指的数左移(j-i)次,至i的前面,然后i从j+1开始继续此循环
  • 当j右移直到n-1没有奇数,结束循环
    在这里插入图片描述
    3.(思路)相比于每次判断偶数时交换,不如判断两个奇数中间有间隔时交换,这样可以可以对连续偶数的情况,实现快速处理。
  • 定义三个游标:i负责遍历,j负责交换时移位,m负责存储第m个奇数的位置
  • 每次循环执行顺序,tmp=array[i],j=i,
  • 每次循环执行选择,当j=i>m+1时,循环移位array[j] = array[j-1],array[m] = tmp
  • 每次循环执行顺序,m=j+1

代码实现

链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593?answerType=1&f=discussion
来源:牛客网

public class Solution {
    public void reOrderArray(int [] array) {
    	//(选择)特殊情况剔除
        if(array==null || array.length ==0){
            return ;
        }
        //(顺序)定义一个游标m,存放上一个奇数的位置
        int m = 0;
        //(循环)循环数组长度次,判断为奇数时进入分支,
        for(int i=0;i<array.length;i++){
        	//(选择)当为连续奇数的时候,不改变,当跳过了偶数,j=i>m时,则交换
            if((Math.abs(array[i])) % 2 != 0){
                int tmp = array[i];
                int j=i;
                //(循环)循环移位操作,把偶数移至i左边
                while(j>m){
                    array[j] = array[j-1];
                    j--;
                }
                //(顺序)直到j=m时,将tmp赋给array[m]
                array[m] = tmp;
                //(顺序)m右移一位,用来存放下一个奇数
                m=j+1;
            }
        }
    }
}

总结

1·math.abs的作用?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值