本文最后更新于:2020年6月28日 下午
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
实现如下:
//很奇怪,竟然加了“保证奇数和奇数,偶数和偶数之间的相对位置不变。”这个条件→_→
//如果加了这个条件,目前想到的是开辟一个新的vector从array中遍历
//第一次遍历,将奇数push,第二次遍历再将偶数push
class Solution {
public:
void reOrderArray(vector<int> &array)
{
vector<int> res;
for (int i = 0; i < array.size(); ++i)//array为空直接跳出
{
if (array[i] & 0x1)
res.push_back(array[i]);
}
for (int i = 0; i < array.size(); i++)//array为空直接跳出
{
if (array[i] % 2 == 0)
res.push_back(array[i]);
}
array = res;
}
};
//如果不考虑“保证奇数和奇数,偶数和偶数之间的相对位置不变。”这个条件
//维护两个指针/迭代器,itp寻找下一个最近的偶数,its寻找前一个最近的奇数
//当itp > its时,说明全部奇数都在偶数前面
//特殊情况:
//当its - itp == 1时,不需要再交换
//全部为奇数
//全部为偶数
class Solution {
public:
void reOrderArray(vector<int> &array)
{
int size = array.size();
if (size == 0 || size == 1) return;//为空或只有一个元素时
vector<int>::iterator itp = array.begin();
vector<int>::iterator its = array.end() - 1;
int tmp = 0;
while (itp < its)//保证还有数字未调整
{
//寻找下一个偶数,
while (itp != array.end() - 1 && *itp & 0x1) ++itp;
//寻找下一个奇数
while (its != array.begin() && !(*its & 0x1)) --its;
//判断是否itp剩下的全为奇数或its剩下的全为偶数
if (itp == array.end() || its == array.begin()) break;
else if(itp < its)//保证非its - itp == 1的情况
{
tmp = *itp;
*itp = *its;
*its = tmp;
}
}
}
};
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!