题目描述
题目分析
思路一:
- 如果不考虑复杂度问题的话,则最简单的思路是从头扫描整个数组,每碰到一个偶数,拿出这个数字,并且把这个数字后面所有的数字都往前挪动一位,挪完之后的数组,最后面有一个空位,这个时候我们把这个偶数放在这个空余的位置上就好了。但是由于每次碰到一个偶数就需要挪动n个数字,因此,这种算法的总的时间复杂度为O(n^2),所以说,其实这种算法的时间效率并不是很高。
- 碰到不满足题目要求的地方,就对数组中的元素进行交换的操作就可以了
class Solution {
public:
void reOrderArray(vector<int> &array)
{
for (int i = 0; i < array.size();i++)
{
for (int j = array.size() - 1; j>i;j--)
{
if (array[j] % 2 == 1 && array[j - 1]%2 == 0)
{
swap(array[j], array[j-1]);
}
}
}
}
};
思路二:
- 这道题目的要求是使得所有的奇数全部位于偶数的前面,也就是说,我们在扫描这个数组的时候,如果有发现偶数出现在奇数的前面,那么我们就交换他们的顺序,交换顺序之后,就是符合要求的了。
- 因此,我们可以使用两个指针,第一个指针指向数组的第一个元素,他只会向后移动,第二个指针指向数组的最后一个元素,他只会向前移动,在两个指针相遇之前,第一个指针总是处于第二个指针的前面,如果第一个指针指向的是偶数,第二个指针指向的是奇数,那么就交换这两个指针的位置。
- 但是我通过运行指针交换的方法,无法通过代码所有的测试用例,因为指针的交换方法,会改变元素的相对位置,不满足题目的要求,所以不能完成交换
思路三:vector的动态数组来进行代码的编写
代码如下所示:
class Solution {
public:
void reOrderArray(vector<int> &array)
{
vector<int>odday;
vector<int>evenay;
int n=array.size();
for(int i=0;i<n;i++)
{
if(array[i]%2==1)
odday.push_back(array[i]);
else
evenay.push_back(array[i]);
}
array.clear();
for(int i=0;i<odday.size();i++)
array.push_back(odday[i]);
for(int i=0;i<evenay.size();i++)
array.push_back(evenay[i]);
}
};
测试用例
- 功能测试(输入数组中的奇数,偶数交替出现;输入的数组中所有的偶数都出现在奇数的后面;输入的数组中所有的奇数都出现在偶数的前面
- 特殊的输入测试(输入nullptr指针;输入的数组中只有一个数字)