本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目

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

思路

  对于任意一个整数数组,设置一个指针,从前往后走,如果遇到奇数则指针后移,遇到偶数时,希望把该偶数放在数组后面;因此,再设置一个指针,从后往前走,遇到偶数时指针前移,遇到奇数时,则恰好可以与前面的指针所指的偶数进行调换。

测试算例 

  1.功能测试(数组中奇偶数交替出现;数组中先奇数后偶数;数组中先偶数后奇数)

  2.特殊测试(null,空数组,一个数据的数组)

完整Java代码

(含测试代码)

package _21;

import java.util.Arrays;

/**
*
* @Description 调整数组顺序使奇数位于偶数前面
*
* @author yongh
* @date 2018年10月11日 上午10:12:01
*/ //题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有
//奇数位于数组的前半部分,所有偶数位于数组的后半部分。 public class ReorderArray { public void reOrderArray(int [] array) {
if(array==null || array.length==0)
return;
int length = array.length;
int low=0;
int high=length-1;
int temp;
while(low<high){
//向后移动low指针,直到它指向偶数
while(low<length && (array[low]&1)!=0)
low++;
//向前移动high指针,直到它指向奇数
while(high>=0 && (array[high]&1)==0)
high--;
if(low<high){
temp=array[low];
array[low]=array[high];
array[high]=temp;
}
}
} //===============测试代码===================
void test1() {
int[] array = null;
System.out.println("原始数组:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("调整结果:"+Arrays.toString(array));
System.out.println();
} void test2() {
int[] array = {};
System.out.println("原始数组:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("调整结果:"+Arrays.toString(array));
System.out.println();
} void test3() {
int[] array = {-2,4,-6,1,-3,5};
System.out.println("原始数组:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("调整结果:"+Arrays.toString(array));
System.out.println();
} void test4() {
int[] array = {-1,3,-5,2,-4,6};
System.out.println("原始数组:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("调整结果:"+Arrays.toString(array));
System.out.println();
} void test5() {
int[] array = {-1,2,-3,4,-5,6};
System.out.println("原始数组:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("调整结果:"+Arrays.toString(array));
System.out.println();
} void test6() {
int[] array = {2,2,1,3,4,1};
System.out.println("原始数组:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("调整结果:"+Arrays.toString(array));
System.out.println();
} void test7() {
int[] array = {1};
System.out.println("原始数组:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("调整结果:"+Arrays.toString(array));
System.out.println();
} public static void main(String[] args) {
ReorderArray demo = new ReorderArray();
demo.test1();
demo.test2();
demo.test3();
demo.test4();
demo.test5();
demo.test6();
demo.test7();
} }

  

test1 passed!
test2 passed!
test3 passed!
test4 passed!
test5 passed!
test6 passed!

ReorderArray

附加要求

  如果题目附加要求:保证调整后的数组中,奇数和奇数之间,偶数和偶数之间的相对位置不变。

  此时用上面的方法就没法实现该功能,可以采用类似于“直接插入排序”的方法:从头开始遍历,遇到奇数时,将该奇数插入到该奇数前面的偶数之前。(如:从头开始遍历246183,遇到奇数1时,将1插入到246之前,变为:124683;该插入的实质是:奇数前面的所有偶数往后移一位,空出的位置放入该奇数),具体实现方法见下面的代码:

    /*
* 附加要求:保证调整后的数组中,奇数和奇数之间,偶数和偶数之间的相对位置不变。
* 采用类似直接插入排序算法
*/
public void reOrderArray2(int [] array) {
if(array==null || array.length==0)
return;
int length = array.length;
int temp,j;
for(int i=1;i<length;i++) {
if((array[i]&1)!=0) {
j=i;
temp=array[j];
while((j>0)&&(array[j-1]&1)==0) {
array[j]=array[j-1];
j--;
}
array[j]=temp;
}
}
}

  

收获

  学会灵活应用指针。

  

更多:《剑指Offer》Java实现合集  

【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面的更多相关文章

  1. 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Offer 21 这题的解法其实是考察快慢指针和头尾指针. package com.walegarrett.offer; /** * @Aut ...

  2. 剑指Offer:调整数组顺序使奇数位于偶数前面【21】

    剑指Offer:调整数组顺序使奇数位于偶数前面[21] 题目描述 输入一个整形数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解题分析 使用插 ...

  3. 剑指offer:调整数组顺序使奇数位于偶数前面

    题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...

  4. 【剑指Offer】调整数组顺序使奇数位于偶数前面 解题报告(Python)

    [牛客网]调整数组顺序使奇数位于偶数前面 解题报告 标签(空格分隔): 牛客网 题目地址:https://www.nowcoder.com/questionTerminal/beb5aa231adc4 ...

  5. 剑指offer(07)-调整数组顺序使奇数位于偶数前面【转】

    来源:http://www.acmerblog.com/offer-6-2429/ 题目来自剑指offer系列 九度 1516 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得 ...

  6. Go语言实现:【剑指offer】调整数组顺序使奇数位于偶数前面

    该题目来源于牛客网<剑指offer>专题. 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和 ...

  7. 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

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

  8. 剑指Offer 13. 调整数组顺序使奇数位于偶数前面 (数组)

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

  9. 【剑指offer】调整数组顺序使奇数位于偶数前面

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

随机推荐

  1. wireshark数据包分析

    最近有不少同事开始学习Wireshark,他们遇到的第一个困难就是理解不了主界面上的提示信息,于是跑来问我.问的人多了,我也总结成一篇文章,希望对大家有所帮助.Wireshark的提示可是其最有价值之 ...

  2. SQL——将表中的最大ID+1插入新的ID中------Insert into 表 MAX(表id) +1

    表结构:group表(groupid int,groupname varchar) 表中数据:id name 分组1 分组2 分组3 分组4 ----------------------------- ...

  3. json 不能 dumps Decimal 解决办法

    class DecimalEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, decimal.Decimal): ret ...

  4. fatal error C1083: 无法打开包括文件: “SDKDDKVer.h”: No such file or directory(转)

    fatal error C1083: 无法打开包括文件: “SDKDDKVer.h”: No such file or directory 解决办法:(Vs2013中) 项目--右键--属性--配置属 ...

  5. POJ3436 ACM Computer Factory【EK算法】

    题意: 每个电脑需要P个组成部分,现有N的机器,每个机器都可以对电脑进行加工,不过加工的前提是某些部分已经存在,加工后会增加某些部分.且在单位时间内,每个机器的加工都有一个最大加工容量,求能得到的最大 ...

  6. Oracle-数据泵使用

    一.为何选择数据泵方式 相对于exp/imp方式,数据泵(expdp/impdp)更快,且能导出空表:相对于rman.dg等方式,数据泵操作更加简单.此外,在数据量不大.可停库的情况下,数据泵方式是可 ...

  7. java线程池如何合理的设置大小

    线程池究竟设置多大要看你的线程池执行的什么任务了,CPU密集型.IO密集型.混合型,任务类型不同,设置的方式也不一样 任务一般分为:CPU密集型.IO密集型.混合型,对于不同类型的任务需要分配不同大小 ...

  8. Theano教程:Python的内存管理

    在写大型程序时候的一大挑战是如何保证最少的内存使用率.但是在Python中的内存管理是比较简单的.Python显示分配内存,使用引用计数系统管理对象,当指向某一个对象的引用数变为 0 的时候,该对象所 ...

  9. 【转载】apache log配置 按日期写日志

    指定apache日志每天生成一个文件 Linux系统配置方法 在apache的配置文件httpd.conf中找到 代码如下1 ErrorLog logs/error_log CustomLog log ...

  10. 【vim】查找重复的连续的单词

    当你很快地打字时,很有可能会连续输入同一个单词两次,就像 this this.这种错误可能骗过任何一个人,即使是你自己重新阅读一遍也不可避免.幸运的是,有一个简单的正则表达式可以用来预防这个错误.使用 ...