剑指offer-面试题14.调整数组顺序使奇数位于偶数的前面
2016-04-07 20:23
567 查看
题目:输入一个整数数组,实现一个函数来调整该数组中的数字的顺序,使得所有的奇数位于数组的前半部门,所有的偶数位于数组的后半部门。
这一题一看其实是很简单的,当然在不考虑效率的情况可以这样考虑我们将数组从前开始索引只要发现偶数这将偶数取出来并且将偶数后面的元素全部前移一个然后将偶数插入到最后,这样扫描一遍之后就将偶数全部放在了后半部门,奇数放在了前半部分。但是效率不好每次遇到偶数都要移动偶数后面的所有元素再加上遍历数组的时间则达到了O(n2)
我们可以用两个索引或者指针,一个指向数组的末尾一个指向数组的开始。
1.前面的索引向后移动直到遇到偶数,后面的索引向前索引直到遇到奇数
2.交换两个元素
3.重复步骤1,2知道后面的的索引与前面的索引相遇或者在前面的索引之前则结束。
实现代码如下:
运行截图:
这一题一看其实是很简单的,当然在不考虑效率的情况可以这样考虑我们将数组从前开始索引只要发现偶数这将偶数取出来并且将偶数后面的元素全部前移一个然后将偶数插入到最后,这样扫描一遍之后就将偶数全部放在了后半部门,奇数放在了前半部分。但是效率不好每次遇到偶数都要移动偶数后面的所有元素再加上遍历数组的时间则达到了O(n2)
我们可以用两个索引或者指针,一个指向数组的末尾一个指向数组的开始。
1.前面的索引向后移动直到遇到偶数,后面的索引向前索引直到遇到奇数
2.交换两个元素
3.重复步骤1,2知道后面的的索引与前面的索引相遇或者在前面的索引之前则结束。
实现代码如下:
1 #include <iostream> 2 using namespace std; 3 4 void RecorderOddEven(int *pData,int length) 5 { 6 int p1,p2; 7 p1=0; 8 p2=length-1; 9 10 while(p2>p1) 11 { 12 while(p2>p1&&pData[p1]%2!=0) 13 p1++; 14 while(p2>p1&&pData[p2]%2==0) 15 p2--; 16 17 int temp; 18 temp=pData[p1]; 19 pData[p1]=pData[p2]; 20 pData[p2]=temp; 21 } 22 } 23 24 int main(int argc, char* argv[]) 25 { 26 int nums[5]={1,2,3,4,5}; 27 int length=5; 28 RecorderOddEven(nums,length); 29 for(int i=0;i<length;i++) 30 { 31 cout<<nums[i]<<","; 32 } 33 cout<<endl; 34 return 0; 35 }
运行截图:
相关文章推荐
- 剑指offer-面试题13.在O(1)时间删除链表节点
- 剑指offer-面试题12.打印1到最大的n位数
- 剑指offer-面试题11.数值的整数次方
- 优秀程序员应具备的5项基本素质
- 优秀程序员应具备的5项基本素质
- 剑指offer-面试题10:二进制中1的个数
- LeetCode(32)-Binary Tree Level Order Traversal
- 剑指offer-面试题9.斐波拉契数列
- 剑指offer-面试题8.旋转数组的最小数字
- 剑指offter-面试题7.用两个栈实现队列
- 剑指offer-面试题6.重建二叉树
- 剑指offer-面试题5.从尾到头打印链表
- 剑指offer-面试题4.替换空格
- 剑指offer-面试题3.二维数组中的查找
- 剑指offer-面试题2.实例Singleton模式
- 剑指offer面试题 圆圈中最后剩下的数字(约瑟夫环问题)
- 剑指offer面试题 扑克牌的顺子
- 剑指offer-面试题1:赋值运算符函数
- 百度面试题:宏的概念,与函数的区别,优缺点的比较
- IT职业发展路线图