剑指offer面试题14——调整数组顺序使奇数位于偶数前面
2015-07-29 16:31
591 查看
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
输入:
每个输入文件包含一组测试案例。
对于每个测试案例,第一行输入一个n,代表该数组中数字的个数。
接下来的一行输入n个整数。代表数组中的n个数。
输出:
对应每个测试案例,
输入一行n个数字,代表调整后的数组。注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格。
第一种情况:按照剑指offer书上的意思,不需要考虑在分好前半部分和后半部分奇偶后的,那个数之间的相对位置话
采用两个指针的做法,一个指针指向第一个数字,一个指向最后一个数字,然后当第一个指向为偶数,第二个指向
为奇数时就进行调换,具体的代码如下:
这道题在九度OJ上面又附加了一个条件,就是在各自的奇偶数的相对位置不能改变,所以呢,这里采用一种用空
间换算法,多增加两个vector,再一次遍历的过程中去保存奇数和偶数,然后再赋值回来,几次n的遍历,最后
的时间复杂度为o(n)。
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
输入:
每个输入文件包含一组测试案例。
对于每个测试案例,第一行输入一个n,代表该数组中数字的个数。
接下来的一行输入n个整数。代表数组中的n个数。
输出:
对应每个测试案例,
输入一行n个数字,代表调整后的数组。注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格。
第一种情况:按照剑指offer书上的意思,不需要考虑在分好前半部分和后半部分奇偶后的,那个数之间的相对位置话
采用两个指针的做法,一个指针指向第一个数字,一个指向最后一个数字,然后当第一个指向为偶数,第二个指向
为奇数时就进行调换,具体的代码如下:
#include<iostream> #include<vector> using namespace std; void ChangeNumber(vector<int>& vec) { if(vec.empty()) return; int n=vec.size(); int i=0; int j=n-1; while(i<j) { while((vec[i]&0x1)&&i<j)//当vec[i]为奇数且i<j时继续向后移动 i++; while((!(vec[j]&0x1))&&i<j)//当vec[j]为偶数时,且i<j时继续向前移动 j--; if(i!=j) { int temp; temp=vec[i]; vec[i]=vec[j]; vec[j]=temp; i++; j--; } } return; } int main() { int ary[5]={1,2,3,4,5}; vector<int> vec(ary,ary+5); for(int i=0;i<vec.size();i++) cout<<vec[i]<<' '; cout<<endl; ChangeNumber(vec); for(int i=0;i<vec.size();i++) cout<<vec[i]<<' '; cout<<endl; }
这道题在九度OJ上面又附加了一个条件,就是在各自的奇偶数的相对位置不能改变,所以呢,这里采用一种用空
间换算法,多增加两个vector,再一次遍历的过程中去保存奇数和偶数,然后再赋值回来,几次n的遍历,最后
的时间复杂度为o(n)。
#include<iostream> #include<vector> using namespace std; void ChangeNumber(vector<int>& vec) { vector<int> vec1; vector<int> vec2; int n1=0;int n2=0; for(vector<int>::iterator i=vec.begin();i!=vec.end();i++) { if(*i%2==0) { vec2.push_back(*i); n2++; } else { vec1.push_back(*i); n1++; } } vector<int>::iterator i=vec.begin(); for(int j=0;j<n1;j++) {*i=vec1[j];i++;} for(int j=0;j<n2;j++) {*i=vec2[j];i++;} return; } int main() { int ary[5]={1,2,3,4,5}; vector<int> vec(ary,ary+5); for(int i=0;i<vec.size();i++) cout<<vec[i]<<' '; cout<<endl; ChangeNumber(vec); for(int i=0;i<vec.size();i++) cout<<vec[i]<<' '; cout<<endl; }
相关文章推荐
- 软件测试面试题-简答题
- 职场中规则
- (剑指Offer)面试题43:n个骰子的点数
- 常见面试题
- 8种影响职场生涯的负面情绪
- OO六大设计原则总结(上层码农必会)
- 剑指offer面试题13——在O(1)时间删除链表结点
- 为什么程序员在办公室工作会趋向死亡?
- 面试题31——连续子数组的最大和
- 黑马程序员——Java基础——异常体系
- 面试题30——最小的k个数
- 黑马程序员--反射Reflect
- 关于java子类重写的一道面试题
- 程序员,为什么千万不要重写代码?
- 为什么软件工程师应该养成写作的习惯?
- 浅谈用力不用脑的程序员:你为什么蹉跎这么多年
- 黑马程序员--Java--正则和反射
- 2016校招内推 -- 腾讯SNG前端 -- 面试经历
- 黑马程序员--Java--集合
- 黑马程序员--java--异常