您的位置:首页 > 职场人生

剑指offer面试题14——调整数组顺序使奇数位于偶数前面

2015-07-29 16:31 591 查看
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

输入:
每个输入文件包含一组测试案例。
对于每个测试案例,第一行输入一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: