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

2024-08-25 07:18

本文主要是介绍调整数顺序使奇数位于偶数前面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

剑指offer_14 调整数顺序使奇数位于偶数前面


2018/05/14 星期一

题目:输入一个整数数组,实现一个函数用来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。

思考三分钟。。。

一个简单的思路就是,顺序遍历数组,当我们碰到偶数的时候,就将该偶数后面的所有数字往前移一位,然后将该偶数放到数组移动后末尾挪出来的位置之中。整个时间复杂度 O(n2) O ( n 2 )

只完成基本功能的解法

这个题目要求把所有的奇数放在数组的前半部分,偶数放在数组的后半部分。也就是说,如果我们在扫描这个数组的时候,如果发现有偶数在奇数的前面,我们就可以交换他们的顺序。

因此,可以维护两个指针,一个指针初始化指向数组的第一个元素,往后一定;另一个指针指向数组的后面一个元素,往前移动。在两个指针相遇之前,第一个指针总是在第二个指针的前面,如果第一个指针指向的是偶数,就和第二个指针中指向的奇数进行互换。下面以数组{1,2,3,4,5}为例说明。

调整数组{1,2,3,4,5}使得奇数位于偶数前面的过程

图的说明:

  1. 图(a)中把第一个指针指向数组的第一个数字,第二个指针指向数组的第二个位置
  2. 向后移动第一个指针,使它指向一个偶数;向前移动第二个指针,使它指向一个奇数
  3. 交换此时两个指针指向的值。
  4. 继续前面1,2,3等操作,直到第二个指针移动到了第一个指针的前面。

基于上面的分析,写下如下Java代码。

public void ReorderOddEven(int[] array) {if (array == null || array.length == 0) {return;}int pStart = 0;int pEnd = array.length - 1;while (pEnd > pStart) {// 向后移动,直到它指向偶数while (!isEven(array[pStart])) {pStart++;}// 向前移动,直到它指向奇数while (isEven(array[pEnd])) {pEnd--;}if (pEnd > pStart) {// 交换swap(array, pStart, pEnd);}}
}public void swap(int[] array, int i, int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;
}private boolean isEven(int n) {
//         return n % 2 == 0;return (n & 0x1) == 0;
}

考虑可扩展的解法

如果是资深的开发职位,需要考虑程序的扩展性,提出能够解决这一系列问题的解法。例如,数组中按照大小分为两个部分,前面为负数后面为非负数;能被3整数和不能被3整除的数等等。就是将前面的函数解耦出两部分:一是判断数字应该在数组的前半部分还是后半部分,二是拆分数组的操作。(前面代码已经完成了这部分解耦工作)

测试用例

  1. 输入数组中奇数和偶数交替出现;所有的偶数都在奇数的前面;所有的奇数都在偶数前面
  2. 特殊输入测试:输入NULL数组;输入的数组中只有一个元素。

这篇关于调整数顺序使奇数位于偶数前面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104909

相关文章

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

[数据结构]队列之顺序队列的类模板实现

队列是一种限定存取位置的线性表,允许插入的一端叫做队尾(rear),允许删除的一端叫做队首(front)。 队列具有FIFO的性质 队列的存储表示也有两种方式:基于数组的,基于列表的。基于数组的叫做顺序队列,基于列表的叫做链式队列。 一下是基于动态数组的顺序队列的模板类的实现。 顺序队列的抽象基类如下所示:只提供了接口和显式的默认构造函数和析构函数,在派生类中调用。 #i

[数据结构]栈之顺序栈的类模板实现

栈的数组实现形式,采用动态分配数组,不够时可以调整栈的大小。 Stack.h文件:主要定义栈的抽象基类,提供公共的接口函数。 #ifndef STACK#define STACK//栈的抽象基类template<class T>class Stack{public:Stack(){}~Stack(){}virtual void Push(const T& x)=0;virt

C++中类的构造函数调用顺序

当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的 构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。 简而言之,对象是由“底层向上”开始构造的。因为,构造函数一开始构造时,总是 要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时, 如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序