【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面
本文参考自《剑指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;
}
}
}
收获
学会灵活应用指针。
【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面的更多相关文章
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Offer 21 这题的解法其实是考察快慢指针和头尾指针. package com.walegarrett.offer; /** * @Aut ...
- 剑指Offer:调整数组顺序使奇数位于偶数前面【21】
剑指Offer:调整数组顺序使奇数位于偶数前面[21] 题目描述 输入一个整形数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解题分析 使用插 ...
- 剑指offer:调整数组顺序使奇数位于偶数前面
题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...
- 【剑指Offer】调整数组顺序使奇数位于偶数前面 解题报告(Python)
[牛客网]调整数组顺序使奇数位于偶数前面 解题报告 标签(空格分隔): 牛客网 题目地址:https://www.nowcoder.com/questionTerminal/beb5aa231adc4 ...
- 剑指offer(07)-调整数组顺序使奇数位于偶数前面【转】
来源:http://www.acmerblog.com/offer-6-2429/ 题目来自剑指offer系列 九度 1516 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得 ...
- Go语言实现:【剑指offer】调整数组顺序使奇数位于偶数前面
该题目来源于牛客网<剑指offer>专题. 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和 ...
- 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输 ...
- 剑指Offer 13. 调整数组顺序使奇数位于偶数前面 (数组)
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 题目地址 https ...
- 【剑指offer】调整数组顺序使奇数位于偶数前面
一.题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 二.思路: 用 ...
随机推荐
- js 分页问题
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- MHA-手动Failover流程(传统复制>ID复制)
本文仅梳理手动Failover流程.MHA的介绍详见:MySQL高可用架构之MHA 一.基本环境 1.1.复制结构 VMware10.0+CentOS6.9+MySQL5.7.21 ROLE HOST ...
- B - Frogger 最短路变形('最长路'求'最短路','最短路'求'最长路')
http://poj.org/problem?id=2253 题目大意: 有一只可怜没人爱的小青蛙,打算去找他的女神青蛙姐姐,但是池塘水路不能走,所以只能通过蹦跶的形式到达目的地,问你从小青蛙到青蛙姐 ...
- Mybatis进阶学习笔记——动态sql
1.if标签 <select id="queryByNameAndTelephone" parameterType="Customer" resultTy ...
- java 多线程和并行程序设计
多线程使得程序中的多个任务可以同时执行 在一个程序中允许同时运行多个任务.在许多程序设计语言中,多线程都是通过调用依赖系统的过程或函数来实现的 为什么需要多线程?多个线程如何在单处理器系统中同时运行? ...
- python读写文件字符集
操作I/O的能力是由操作系统的提供的,每一种编程语言都会把操作系统提供的低级C接口封装起来供开发者使用,Python也不例外. 读写文件是需要请求操作系统去操作磁盘的 所以默认的编码就是你平台的编 ...
- latex 字体大小设置
tex 设置字体大小命令由小到大依次为: \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE \huge \ ...
- 【vim】实时加密文本 ggVGg?
如果你不想让别人看懂你的屏幕上的内容,你可以使用一个内置的选项,通过下面的命令使用 ROT13 来对文本进行编码: ggVGg? gg 把光标移动到 Vim 缓冲区的第一行, V 进入可视模式, G ...
- mac安装pyspider报错
(env)$ pip3 uninstall pycurl (env)$ pip3 install --upgrade pip (env)$ export LDFLAGS=-L/usr/local/op ...
- softlab对接Jenkins工程
在Softlab上对接jenkins工程,必须先在自己的jenkins环境上配置好任务. 1.登陆到jenkins首页,比如http://10.179.175.53:8080/jenkins/ 2.点 ...