当前位置: 首页 > news >正文

【剑指Offer】13、调整数组顺序使奇数位于偶数前面

  题目描述:

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

  解题思路:

  首先,如果不考虑奇数和奇数,偶数和偶数的相对位置,那么我们有一种双指针解法来求解,类似于快排,维护两个指针,第一个指针指向数组的第一个数字,第二个指针指向数组的最后一个数字。第一个指针向后移,第二个指针向前移,如果第一个指针指向偶数,第二个指针指向的是奇数,则交换着两个数字,接着继续移动直到两指针相遇。

  上面的方法看似不错,但是对本题不适用,因为本题有相对位置不变的要求,直接交换会导致相对位置改变。因此,我们采用下面的思路来解决本题。

  本题解法:对数组进行遍历,设置两个指针even和odd,even指向当前第一个偶数,odd从这个偶数之后开始查找,找到第一个奇数,此时为了相对位置不变,不能直接交换even和odd,而是将从even到odd-1的元素都依次向后移一个位置,将odd指向的那个奇数放到even的位置。然后再找下一个偶数,重复这一过程,最终就可以将奇数都放到偶数的前面,并且保证了相对位置的不变。

  编程实现(Java):

    public void reOrderArray(int [] array) {
        int len=array.length;
        int even=0,odd=0; //当前序列的第一个奇数和第一个偶数
        while(odd<len && even<len){
            while(even<len && array[even]%2!=0) //找到第一个偶数even
                even++;
            odd=even+1;
            //找偶数之后的第一个奇数
            while(odd<len && array[odd]%2==0)
                odd++;
            if(odd>=len)  //注意判断,防止溢出
                break;
            //把奇数取出来,从even到odd-1的元素都向后移
            int temp=array[odd];
            for(int i=odd;i>even;i--)
                array[i]=array[i-1];
            array[even]=temp; //奇数放在原来even的位置
            even++;
        }
    }

转载于:https://www.cnblogs.com/gzshan/p/10764984.html

相关文章:

  • 【2019计划】想要变得优秀 顺其自然是不可能的。
  • 常见跨域解决方案
  • 前端工程化
  • 【AtCoder】ARC071
  • [Markdown] 02 简单应用 第二弹
  • webmagic爬虫框架抽取元素
  • ScriptManager的几个属性和方法
  • Alpha冲刺(3/10)——2019.4.25
  • 接口测试基础
  • MySql综合知识汇总
  • FullCalendar Timeline View 使用
  • 08-图9 关键活动 (30 分)
  • Numpy用户指南
  • 涨姿势:抛弃字母、数字和下划线写SHELL
  • c++实现扫描检测硬件改动
  • [译]如何构建服务器端web组件,为何要构建?
  • Angular 4.x 动态创建组件
  • Docker: 容器互访的三种方式
  • docker容器内的网络抓包
  • java正则表式的使用
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • vue-cli在webpack的配置文件探究
  • 从零开始在ubuntu上搭建node开发环境
  • 分享一份非常强势的Android面试题
  • 关于Java中分层中遇到的一些问题
  • 码农张的Bug人生 - 见面之礼
  • 06-01 点餐小程序前台界面搭建
  • 2017年360最后一道编程题
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • $forceUpdate()函数
  • (三)uboot源码分析
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (十一)手动添加用户和文件的特殊权限
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (一)基于IDEA的JAVA基础1
  • (转)Sql Server 保留几位小数的两种做法
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net 生成二级域名
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET的数据绑定
  • .NET框架设计—常被忽视的C#设计技巧
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [C++]18:set和map的使用
  • [C++]C++类基本语法
  • [Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明
  • [Lua实战]整理Lua中忽略的问题
  • [one_demo_1]php中的文件锁
  • [PHP]实体类基类和序列化__sleep问题