【Offer】[21] 【调整数组顺序使奇数位于偶数前面】
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,(偶数之间和奇数之间要保持相对顺序)
思路分析
- 如果题目没有要求保持相对顺序,则可以利用快速排序中的“二分”的思想,设置两个指针分别指向数组的头和尾,要将奇数排在偶数的前面,就要头指针扫描到偶数时停止,尾指针要扫描到奇数时停止
- 如果题目中要求保持相对顺序,可以用直接插入法的思想,如果遇到奇数,就将该奇数排在它最前面的偶数之前。
测试用例
- 功能测试:输入数组中的奇数、偶数交替出现;输入的数组中所有偶数都出现在奇数的前面;输入的数组中所有奇数都出现在偶数的前面。
- 特殊输入测试:输入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】[21] 【调整数组顺序使奇数位于偶数前面】的更多相关文章
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Offer 21 这题的解法其实是考察快慢指针和头尾指针. package com.walegarrett.offer; /** * @Aut ...
- 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...
- 剑指Offer:调整数组顺序使奇数位于偶数前面【21】
剑指Offer:调整数组顺序使奇数位于偶数前面[21] 题目描述 输入一个整形数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解题分析 使用插 ...
- 【剑指offer】面试题 21. 调整数组顺序使奇数位于偶数前面
面试题 21. 调整数组顺序使奇数位于偶数前面
- 剑指offer:调整数组顺序使奇数位于偶数前面
题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...
- 【剑指Offer】调整数组顺序使奇数位于偶数前面 解题报告(Python)
[牛客网]调整数组顺序使奇数位于偶数前面 解题报告 标签(空格分隔): 牛客网 题目地址:https://www.nowcoder.com/questionTerminal/beb5aa231adc4 ...
- 《剑指offer》面试题21. 调整数组顺序使奇数位于偶数前面
问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4] 输出:[1,3,2,4] ...
- 剑指offer(07)-调整数组顺序使奇数位于偶数前面【转】
来源:http://www.acmerblog.com/offer-6-2429/ 题目来自剑指offer系列 九度 1516 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得 ...
- Go语言实现:【剑指offer】调整数组顺序使奇数位于偶数前面
该题目来源于牛客网<剑指offer>专题. 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和 ...
- 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输 ...
随机推荐
- UR机器人通信--上位机通信(python)
一.通信socket socket()函数 Python 中,我们用 socket()函数来创建套接字,语法格式如下: socket.socket([family[, type[, proto]]]) ...
- Redis进阶应用:Redis+Lua脚本实现复合操作
一.引言 Redis是高性能的key-value数据库,在很大程度克服了memcached这类key/value存储的不足,在部分场景下,是对关系数据库的良好补充.得益于超高性能和丰富的数据结构,Re ...
- selenium操作cookies实现免密登录,自动发微博
一直想用selenium实现个小功能,比如发微博之类的,但是有的网站在登录会有验证码,没想到太好的方法解决,于是想到利用cookies来登录网站 第一步:获取一个可用的cookies,获取的cooki ...
- apicloud 开发环境搭建
之前做过appcan 手机应用的开发,工作需要切换的apicloud , 开发环境的的搭建是开发的第一步,let's go 1新建应用 step1 注册账号 注册apicloud 账号:https ...
- Java.基础 -------- 一个Java源文件中可以有很多类,但只能有一个类是public的
一个Java源文件中可以有很多类,但只能有一个类是public的 Java程序是从一个public类main函数开始执行的,只能有一个public是为了给类装载器提供方便,一个publi ...
- js拖拽上传图片
有时候,在开发中,需要遇到拖拽上传图片的需求,即从磁盘选中一张或多张图片,然后按着鼠标把图片拖动到页面上指定的区域,实现图片的上传. 1.后端上传图片的接口 我是之前用vue写一个简单的后台系统的时候 ...
- 重学计算机组成原理(六)- 函数调用怎么突然Stack Overflow了!
用Google搜异常信息,肯定都访问过Stack Overflow网站 全球最大的程序员问答网站,名字来自于一个常见的报错,就是栈溢出(stack overflow) 从函数调用开始,在计算机指令层面 ...
- (十五)c#Winform自定义控件-键盘(二)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- JMeter的JTL大文件解析
1.背景 不知大家在使用JMeter工具进行性能测试时,是否遇到过JTL结果文件过大导致GUI页面长时间解析无响应的问题.这种情况往往出现在稳定性测试场景下,此时的JTL文件大小可能已经达到G级别了. ...
- Xshell登陆服务器及Linux的简单命令
在之前的推文中,我已经给出了怎样利用Git登陆服务器”你在用xshell,putty登陆?推荐一个小工具(Git)登陆“其中包括xshell登陆服务器.今天讲讲常见的Linux命令,这个和之前将的利用 ...