题目描述

  输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,(偶数之间和奇数之间要保持相对顺序)

思路分析

  1. 如果题目没有要求保持相对顺序,则可以利用快速排序中的“二分”的思想,设置两个指针分别指向数组的头和尾,要将奇数排在偶数的前面,就要头指针扫描到偶数时停止,尾指针要扫描到奇数时停止
  2. 如果题目中要求保持相对顺序,可以用直接插入法的思想,如果遇到奇数,就将该奇数排在它最前面的偶数之前。

测试用例

  1. 功能测试:输入数组中的奇数、偶数交替出现;输入的数组中所有偶数都出现在奇数的前面;输入的数组中所有奇数都出现在偶数的前面。
  2. 特殊输入测试:输入nullptr指针;输入的数组只包含一个数字。

Java代码

public class Offer21 {
public static void main(String[] args) {
test1();
test2();
test3();
test4();
} public static void reOrderArray(int[] array) {
Solution2(array);
} /**
* 这种方法会打乱偶数之间 奇数之间的相对顺序(题目中并没有要求)
* 思路,利用快速排序中思想
* @param array
*/
private static void Solution1(int[] array) {
if(array == null) {
throw new IllegalArgumentException("参数非法!");
}
int i = 0;
int j = array.length - 1;
while (i < j) {
while (i < j && !isEven(array[i])) {//如果是奇数i下标后移,直到指向偶数
i++;
}
while (i < j && isEven(array[j])) {//如果是偶数j 下标前移,直到指向奇数
j--;
}
if (i < j) {
int tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
}
} /**
* 当题目中要求要保持偶数之间 奇数之间的相对顺序时,
* 就需要用到这种方法
* 思路:插入排序的思想
* @param array
*/
private static void Solution2(int[] array) {
if(array==null || array.length<=0) {
throw new IllegalArgumentException("参数非法!");
}
int j,tmp;
for(int i=1;i<array.length;i++) {
if(!isEven(array[i])) {
tmp = array[i];
//此处j>=0的条件要放在前面
for(j=i-1; j>=0 && isEven(array[j]);j--) {
array[j+1] = array[j];
}
array[j+1] = tmp; // 这种方式 也行
// j=i;
// while(j>0 && isEven(array[j-1])) {
// array[j] = array[j-1];
// j--;
// }
// array[j] = tmp; }
}
} private static boolean isEven(int number) {
return (number & 1) == 0;
} private static void test1() {
int[] array = { -1, 9, 5, 2, 10, 6 };
System.out.println("原始数组:" + Arrays.toString(array));
reOrderArray(array);
System.out.println("调整结果:" + Arrays.toString(array));
System.out.println();
} private static void test2() {
int[] array = { 2,10,8, 9,-7,17};
System.out.println("原始数组:" + Arrays.toString(array));
reOrderArray(array);
System.out.println("调整结果:" + Arrays.toString(array));
System.out.println();
} private static void test3() {
int[] array = { 2};
System.out.println("原始数组:" + Arrays.toString(array));
reOrderArray(array);
System.out.println("调整结果:" + Arrays.toString(array));
System.out.println();
} private static void test4() {
int[] array = null;
reOrderArray(array);
}
}

代码链接

剑指Offer代码-Java

【Offer】[21] 【调整数组顺序使奇数位于偶数前面】的更多相关文章

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

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

  2. 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...

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

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

  4. 【剑指offer】面试题 21. 调整数组顺序使奇数位于偶数前面

    面试题 21. 调整数组顺序使奇数位于偶数前面

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

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

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

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

  7. 《剑指offer》面试题21. 调整数组顺序使奇数位于偶数前面

    问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4] 输出:[1,3,2,4] ...

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

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

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

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

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

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

随机推荐

  1. 用CSS来定义<p>标签,要求实现以下效果:字体颜色再IE6下为黑色,IE7下为红色,IE8下为绿色,其他浏览器下为黄色。

    <!DOCTYPE html><html><head><meta charset="utf-8"><meta name=&qu ...

  2. 初试kafka消息队列中间件二(采用java代码收发消息)

    初试kafka消息队列中间件二(采用java代码收发消息) 上一篇 初试kafka消息队列中间件一 今天的案例主要是将采用命令行收发信息改成使用java代码实现,根据上一篇的接着写: 先启动Zooke ...

  3. JVM解剖乐园

    1.JVM锁粗化和循环原文标题:JVM Anatomy Quark #1: Lock Coarsening and Loops 众所周知Hotsport编译器会进行JVM锁粗化和优化,它将相邻的锁区块 ...

  4. indexedDB添加,删除,获取,修改

    [toc] 在chrome(版本 70.0.3538.110)测试正常 编写涉及:css, html, js 在线演示codepen html代码 <h1>indexedDB</h1 ...

  5. Linux系统关机与重新引导流程简介

    引言 在<Linux启动之旅>中,我们了解了Linux的启动过程,下面我们一同来学习Linux关机与重新引导流程. 不同于桌面系统,作为服务器,我们较少对Linux系统进行系统重启,但在以 ...

  6. Linux--shell的基本特性--01

    1.bash的基本特性: a) 命令展开:date命令—— 基于date命令创建命令 查看系统时钟:date 查看硬件时钟: clock .hwclock (常常同步系统时钟与硬件时钟) cal 查看 ...

  7. flink 1.7.2 安装详解

    ##flink 1.7.2 安装需要java环境 下载地址 https://flink.apache.org/downloads.html#1.单机版 #创建用户flinkuseradd flink ...

  8. UWP实现吸顶的Pivot

    话不多说,先上效果 这里使用了一个ScrollProgressProvider.cs,我们这篇文章先解析一下整体的动画思路,以后再详细解释这个Provider的实现方式. 结构 整个页面大致结构是 & ...

  9. Powered by .NET Core 进展0819:高速开车车况汇报

    继续以流水账的方式向大家汇报,自从上周六上午将 .net core 版博客站点从 windows 部署切换到 linux 上的 docker-compose 部署后,到目前一直在线. Linux 上没 ...

  10. idea2019.2安装指南

    先去官网下载idea官网地址 下载UItimate版本点击 DOWNLOAD等待下载完成 点击ideaIU-2019.2.exe一路next      可以在这一步选一下 继续next         ...