【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】调整数组顺序使奇数位于偶数前面
一.题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 二.思路: 用 ...
随机推荐
- 20155332 2016-2017-2 《Java程序设计》第8周学习总结
20155332 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 创建Logger对象 static Logger getLogger(String name ...
- luogu P3304 [SDOI2013]直径
树的直径两遍dfs救星了 至于一定在直径中的边数,可以发现这些边一定是连续的(不然你两条直径中间能有空挡?),然后,如果某个点往下有多条直径,那么这条点以下都不算入答案.所以以直径分别两端点为根,找出 ...
- luogu P1776 宝物筛选_NOI导刊2010提高(02)
Sto flashhu orz flash太强啦 多重背包裸题(逃 使用压维大法,\(f_i\)为总重量为\(i\)时的答案 对于每种物品,记\(w\)为单个的重量,\(v\)为单个的价值,\(m\) ...
- Ubuntu16.04安装搜狗拼音输入法(中文输入法)
虽然网上有很多教程,但是我觉得我的很适合那些真正的小白... 1.下载文件 由于我要给多台电脑安装搜狗输入法,所以用的是文件夹安装,不是命令行安装. 打开官网http://pinyin.sogou.c ...
- git操作之冲突解决
应用场景,任哥,我两个人共同修改了git项目上的一个文件.zsh命令行模式 准备工作 简写命令解释 gl=git pullgp=git pushgst=git statusgcmsg=git comm ...
- java多线程系列五、并发容器
一.ConcurrentHashMap 1.为什么要使用ConcurrentHashMap 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,HashMap在 ...
- Window下通过charles代理抓取iphone/android手机Https请求乱码问题处理
Window下通过charles代理抓取iphone手机Https请求乱码问题 如果保持默认设置,https的reqeust和response都是乱码,设置完之后https就可以抓包了 手机端操作: ...
- 基于url拦截
- svn使用小技巧
在使用svn的时候,往往导入到eclipse中,使用eclipse进行提交修改,但是当删除文件夹的时候,eclipse会发生冲突,不能够提交. 使用一种方式,将svn上的项目跟你eclipse对应项目 ...
- Expm 4_1 多段图中的最短路径问题
[问题描述] 建立一个从源点S到终点T的多段图,设计一个动态规划算法求出从S到T的最短路径值,并输出相应的最短路径. 解 package org.xiu68.exp.exp4; public cl ...