方法一:两次遍历
1.结题思路
简单题,两次遍历原始数组,分别将奇偶数按序加入结果数组
2.解法
遍历两次array数组,第一次遍历时,将所有奇数数组元素加入ans数组,第二次遍历时,将所有偶数数组元素加入ans数组
3.图解
4.具体代码
vector<int> reOrderArray(vector<int>& array) {
vector<int>ans;
for(auto it=array.begin();it!=array.end();it++){
if(*it&1)ans.push_back(*it);
}
for(auto it=array.begin();it!=array.end();it++){
if(*it%2==0)ans.push_back(*it);
}
return ans;
}5.时间复杂度和空间复杂度分析
时间复杂度:O(n),n是数组元素个数,仅遍历了两次数组。
空间复杂度:O(n),n是数组元素个数,用到了一维数组。
方法二:移动数组元素
1.结题思路
有点类似插入排序的思想,数组分成两部分,前半部分放我们已经处理好的调到前面来的奇数,后半部分放偶数,每次将奇数插入已排列好的奇数尾部。
2.解法
首先用一个变量pre保存已经移动到数组前部的奇数的下一个存放位置的下标,接着用变量temp临时保存一个这个奇数,并将前面所有的偶数后移一位,最后将temp所保存的奇数填入ans[pre],并更新pre++
3.图解
4.具体代码
/*vector<int> a;
for(int i=0;i<10;i++)
a[i]=i;
这种做法以及类似的做法都是错误的。下标只能用于获取已存在的元素;而现在的a[i]还是空的对象*/
vector<int> reOrderArray(vector<int>& array) {
vector<int>ans(array);//用array来定义ans;
int pre=0;
for(int i=0;i<array.size();i++){
if(array[i]&1){
int temp=array[i];
for(int j=i;j>pre;j--){
ans[j]=ans[j-1];
}
ans[pre++]=temp;
}
}
return ans;
}5.时间复杂度和空间复杂度分析
时间复杂度:O(n^2),n是数组元素个数,类比插入排序,平均情况O(n^2)。
空间复杂度:O(n),n是数组元素个数。

京公网安备 11010502036488号