剑指Offer——面试题21:调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面
https://www.nowcoder.com/practice/beb5aa231adc45b2a5dcc5b62c93f593?tpId=13&tqId=11166&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分
算法分析
题目比较简单,设置两个指针 p1 和 p2 分别指向数组的开始和结尾,p1向后遍历,p2向前遍历,如果发现 p1 指向偶数,p2 指向奇数(即偶数在奇数之前),则将两者交换,一直做下去,直到 p1 > p2
程序代码
class Solution {
public:
void reOrderArray(vector<int> &array)
{
//这个一定要加上
if(array.empty())
return;
vector<int>::iterator p1 = array.begin();
vector<int>::iterator p2 = array.end()-1;
while(p1 < p2)
{
while((*p1&0x1) && p1<p2) p1++;//如果*p1是奇数
while(!(*p2&0x1) && p1<p2) p2--;//如果*p2是偶数
if(p1 < p2)
{
int temp;
temp = *p2;
*p2 = *p1;
*p1 = temp;
p1++;
p2--;
}
}
}
}; 扩展部分
如果在题目要求的基础上,保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路
设置指针 p 指向数组首元素,change变量用于记录交换的次数。
从前向后遍历数组,如果发现 (p&0x1)==0 && ((p+1)&0x1)!=0,即偶数在奇数之前就交换,change加1,直到没有发生交换后跳出循环,程序结束。
程序代码
class Solution {
public:
void reOrderArray(vector<int> &array)
{
if(array.empty())
return;
vector<int>::iterator p;
int change = 1;
while(change)
{
p = array.begin();
change = 0;
while(p != array.end())
{
if((*p&0x1)==0 && (*(p+1)&0x1)!=0)
{
int temp;
temp = *(p+1);
*(p+1) = *p;
*p = temp;
change++;
}
p++;
}
}
}
};
联想公司福利 1500人发布
