剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面
2015-08-01 12:41
639 查看
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
1、基本实现:
如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有的数字往前面挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于没碰到一个偶数就需要移动O(n)个数字,因此总的时间复杂度是O(n2).但是,这种方法不能让面试官满意。不过如果我们在听到题目之后马上能够说出这个解法,面试官至少会觉得我们的思维非常灵敏。
2、只完成基本功能的解法,仅适用于初级程序员
这个题目要求把奇数放在数组的前半部分,偶数放在数组的后半部分,因此所有的奇数应该位于偶数的前面,也就是说我们在扫描这个数组的时候,如果发现有偶数在奇数的前面,我们可以交换他们的数序,交换之后就符合要求了。
因此我们可以维护两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动;第二个指针初始化时指向数组的最后一个数字,它指向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针的数字是偶数,并且第二个指针指向的数字是奇数,我们就交换两个数字。
3、考虑可扩展性的解法,秒杀Offer
如果是面试应届毕业生或者工作时间不长的程序员,面试官会满意前面的代码,但如果应聘者申请的是资深的开发职位,那面试官可能会接着问几个问题。
面试官:如果把题目改成数组中的数按照大小分为两部分,所有的负数在所有的非负数的前面,该怎么做?
如果再把题目改改,变成 把数组中的数分成两部分,能被3整除的数都在不能被3整除的数的前面,怎么办?
这就是面试官在考察我们对可扩展性的理解,即希望我们能够给出一个模式,在这个模式下能够很方面第把已有的解决方案扩展到同类型的问题上去。
于是我们写出下面的代码:
1、基本实现:
如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有的数字往前面挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于没碰到一个偶数就需要移动O(n)个数字,因此总的时间复杂度是O(n2).但是,这种方法不能让面试官满意。不过如果我们在听到题目之后马上能够说出这个解法,面试官至少会觉得我们的思维非常灵敏。
2、只完成基本功能的解法,仅适用于初级程序员
这个题目要求把奇数放在数组的前半部分,偶数放在数组的后半部分,因此所有的奇数应该位于偶数的前面,也就是说我们在扫描这个数组的时候,如果发现有偶数在奇数的前面,我们可以交换他们的数序,交换之后就符合要求了。
因此我们可以维护两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动;第二个指针初始化时指向数组的最后一个数字,它指向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针的数字是偶数,并且第二个指针指向的数字是奇数,我们就交换两个数字。
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-面试题5 :从尾到头打印链表
- 黑马程序员——字符串常见操作
- 每个程序员和设计师必做的10项运动
- 黑马程序员——OC类方法
- 【练习笔记】剑指offer-面试题4 :替换空格
- 面试30 求数组中最小的k个数
- 看不惯别人
- 黑马程序员---iOS基础---OC中类创建对象
- 黑马程序员——自学总结(九)正则表达式
- 黑马程序员——OC中方法的声明实现及调用
- 【LeetCode-面试算法经典-Java实现】【061-Rotate List(旋转单链表)】
- 九章算法面试题78 有效回文串
- 硅谷IT企业面试风格漫谈 I - Start Up 面些啥?
- 找工作知识储备(3)---从头说12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用
- 黑马程序员----java基础String和stringbuffer总结
- PHP程序员的一生
- 面试题:在宏达杯足球联赛前,四个球迷有如下4个预测: 其中一个是假,则结论正确的是?
- 黑马程序员_Java基础:序列化(Serializable)与反序列化
- 面试题37_两个链表的第一个公共结点
- php5.3以后各版本的特性(主要是整理一下面试用的)