牛客网刷题笔记记录。参考自:https://cuijiahua.com/blog/2017/11/basis_13.html
一.题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
二.思路分析
错误思路:一开始没看到“并保证奇数和奇数,偶数和偶数之间的相对位置不变。”
受到快排的思想启发想了一个算法:ptr1从前往后遍历数组,ptr2从后往前遍历数组;当ptr1遇到偶数时停下,ptr2遇到奇数时停下,然后交换两个位置元素值。ptr1和ptr2继续各自的遍历重复上述操作,直到ptr1等于ptr2。
正确思路:这个正确思路真是简洁明了,证明stl各种成熟数据结构的熟练使用是很重要的
创建双向队列,遍历数组,奇数前插入,偶数后插入。最后使用assign方法实现不同容器但相容的类型赋值。
三.编程实现
C++实现:
错误思路:虽然不对,但还是记录一下这个思想吧
class Solution {
public:
void reOrderArray(vector<int> &array) {
int length=array.size();
int index1=0,index2=length-1;
while( index1<index2 )
{
while(array[index1]%2!=0)
{
index1++;
}
while(array[index2]%2==0)
{
index2--;
}
if (index1 < index2)
{
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
}
}
};
正确思路:
class Solution {
public:
void reOrderArray(vector<int> &array) {
deque<int> result;
int num =array.size();
for(int i=0;i<num;i++)
{
if(array[num-i-1]%2 == 1)
{
result.push_front(array[num-i-1]);
}
if(array[i]%2==0)
{
result.push_back(array[i]);
}
}
array.assign(result.begin(),result.end());
}
};