AcWing 32. (再看看)调整数组顺序使奇数位于偶数前面
原题链接
简单
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int> a;//用于存储偶数的临时数组
for(int i=0;i<array.size();i++)
{
//将偶数存入临时数组
if(array[i]%2==0)
{ a.push_back(array[i]);
array.erase(array.begin()+i);//删除原数组的偶数
i--;//因为删除了一个偶数,需要将索引退一步
}
}
// 将临时数组中的偶数插入到原数组的末尾
for(auto b:a){
array.push_back(b);
}
}
};
//这段代码首先遍历原始数组,将偶数存入临时数组 a 中,
//并删除原始数组中的奇数。然后再将临时数组中的偶数插入到原始数组的末尾,以完成奇偶数的调整。
//在标准库中,erase 函数的参数是迭代器,而不是索引值。因此,如果要删除指定位置的元素,应该传递一个指向该位置的迭代器,而不是简单的索引值。
//在这段代码中,array.begin() + i 实际上是获取了一个指向数组中第 i 个元素的迭代器。然后,erase 函数接受这个迭代器作为参数,用于删除指定位置的元素。
//这样就能够正确地删除数组中的元素,而不会引起迭代器失效的问题。
//法二:快排:双指针:第一个指针如果是奇数一直往后走,保证第一个指针前面的都是奇数,第二个指针是如果是偶数一直往前走,
//这样保证第二个指针的后面一直是偶数,当两个指针都不能往前走时,说明第一个指针指向了偶数,第二个指向奇数,此时把两个指针的数交换一下
/* void reOrderArray(vector<int> &array) {
int i=0,j=array.size()-1;
while(i<j)
{
while(i<j&&array[i]%2) i++; //奇数时
while(i<j&&array[j]%2==0) j--;
if(i<j) swap(array[i],array[j]);
}
}*/