剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面
题目:输入一个整数数组。实现一个函数来调整该数组中数字的顺序。使得全部奇数位于数组的前半部分。全部偶数位于数组的后半部分。
1、基本实现:
假设不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的全部的数字往前面挪动一位。
挪完之后在数组的末尾有一个空位。这时把该偶数放入这个空位。
因为没碰到一个偶数就须要移动O(n)个数字。因此总的时间复杂度是O(n2).可是,这样的方法不能让面试官惬意。只是假设我们在听到题目之后立就可以以说出这个解法,面试官至少会认为我们的思维很灵敏。
2、仅仅完毕基本功能的解法,仅适用于0基础程序猿
这个题目要求把奇数放在数组的前半部分。偶数放在数组的后半部分。因此全部的奇数应该位于偶数的前面,也就是说我们在扫描这个数组的时候,假设发现有偶数在奇数的前面,我们能够交换他们的数序,交换之后就符合要求了。
因此我们能够维护两个指针,第一个指针初始化时指向数组的第一个数字,它仅仅向后移动。第二个指针初始化时指向数组的最后一个数字。它指向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面。假设第一个指针的数字是偶数,而且第二个指针指向的数字是奇数,我们就交换两个数字。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
3、考虑可扩展性的解法。秒杀Offer
假设是面试应届毕业生或者工作时间不长的程序猿。面试官会惬意前面的代码。但假设应聘者申请的是资深的开发职位。那面试官可能会接着问几个问题。
面试官:假设把题目改成数组中的数依照大小分为两部分,全部的负数在全部的非负数的前面,该怎么做?
假设再把题目改改,变成 把数组中的数分成两部分,能被3整除的数都在不能被3整除的数的前面。怎么办?
这就是面试官在考察我们对可扩展性的理解。即希望我们可以给出一个模式,在这个模式下可以非常方面第把已有的解决方式扩展到同类型的问题上去。
于是我们写出以下的代码:
/**
* 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部奇数位于数组的前半部分,全部的偶数位于数组的后半部分
*/
package swordForOffer; /**
* @author JInShuangQi
*
* 2015年8月1日
*/
public class E14ReorderArray {
public void order(int[] arr){
if(arr == null)
return;
int i = 0;
int j = arr.length-1;
while(i<j){
if(isEven(arr[i]) && !isEven(arr[j])){
int temp = arr[i];
arr[i]= arr[j];
arr[j] = temp;
}
else if(!isEven(arr[i]) && isEven(arr[j])){
i++;
}
else if(isEven(arr[i]) && isEven(arr[j])){
j--;
}else{
i++;
j--;
}
}
}
public boolean isEven(int n){
return (n & 1) == 0;
}
public static void main(String[] args){
E14ReorderArray test = new E14ReorderArray();
int[] arr= {1,2,3,4,5,6,12,7,8,9,10};
test.order(arr);
for(int i = 0;i<arr.length ;i++){
System.out.print(arr[i]+",");
}
}
}
剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面的更多相关文章
- 《剑指offer》第二十一题(调整数组顺序使奇数位于偶数前面)
// 面试题21:调整数组顺序使奇数位于偶数前面 // 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有 // 奇数位于数组的前半部分,所有偶数位于数组的后半部分. #inclu ...
- 《剑指offer》— JavaScript(13)调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的 ...
- 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...
- 【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面
题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2 ...
- 【剑指offer】面试题 21. 调整数组顺序使奇数位于偶数前面
面试题 21. 调整数组顺序使奇数位于偶数前面
- 剑指Offer:调整数组顺序使奇数位于偶数前面【21】
剑指Offer:调整数组顺序使奇数位于偶数前面[21] 题目描述 输入一个整形数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解题分析 使用插 ...
- 剑指offer:调整数组顺序使奇数位于偶数前面
题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...
- 剑指Offer - 九度1516 - 调整数组顺序使奇数位于偶数前面
剑指Offer - 九度1516 - 调整数组顺序使奇数位于偶数前面2013-11-30 02:17 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部 ...
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Offer 21 这题的解法其实是考察快慢指针和头尾指针. package com.walegarrett.offer; /** * @Aut ...
- 调整数组顺序使奇数位于偶数前面 牛客网 剑指Offer
调整数组顺序使奇数位于偶数前面 牛客网 剑指Offer 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇 ...
随机推荐
- Hdu-6119 小小粉丝度度熊 尺取
题面 题意:在一大段时间里,告诉你,你签到了哪些区间,现在再给你m张补签卡,问你最多能实现连续签到多少天 题解:那些时间区间是有重叠的,所以我们先排序离散,并得到哪些区间是可以补签的,这样问题就变成, ...
- JS 中构造函数和普通函数的区别(详)
1.构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写 2.构造函数和普通函数的区别在于:调用方式不一样.作用也不一样(构造函数用来新建实例对象) 3.调用方式不一样. 普通 ...
- 随时随地日志Debug
对于一个应用程序而言,Log必不可少,但是有些时候仅仅想看下输出,如果加log的话就显得比较麻烦,这个时候就用到了Debug.WriteLine("测试下,你好,非常棒,牛叉!") ...
- codeforces 712A. Memory and Crow
2019-05-18 08:48:27 加油,加油,坚持!!! 这道题我没有想出公式推导,只是按照模拟题来做,第5个样例超时 样例超时,方法错误 https://www.cnblogs.com/ECJ ...
- 24. Swap Nodes in Pairs[M]两两交换链表中的节点
题目 Given a linked list, swap every two adjacent nodes and return its head. You may not modify the va ...
- Objective-C浮点数转化整数(向上取整、向下取整)
Objective-C拓展了C,自然很多用法是和C一致的.比如浮点数转化成整数,就有以下四种情况. 1.简单粗暴,直接转化 float f = 1.5; int a; a = (int)f; NSLo ...
- POJ 2492 A Bug's Life 带权并查集
题意: 思路: mod2 意义下的带权并查集 如果两只虫子是异性恋,它们的距离应该是1. 如果两只虫子相恋且距离为零,则它们是同性恋. (出题人好猥琐啊) 注意: 不能输入一半就break出来.... ...
- Nginx介绍及知识点(摘抄)
正向代理是把自己的网络环境切换成代理的网络 反向代理是代理机器返回给我要我的资源 本文借鉴参考于http://tengine.taobao.org/book/chapter_02.html. 属于纯干 ...
- Android Studio复制项目 两个App之间不覆盖安装操作步骤
步骤一:修改包名 第五步注意:不能以数字等作为包名的开头. 步骤二:修改清单文件里面的包名 第八步注意:如果报红,从新引入新的包名下的Mainactivity类. 步骤三:修改Gradle Scrip ...
- linux openSSL 安装
包名:openssh-server apt安装:apt-get install openssh-server yum安装:yum install openssh-server 服务启动:service ...