方法1:我先想的是遍历一遍数组,在遍历时,把奇数放到一个数组,把偶数放到另一个数组。然后再重新遍历一遍,这次遍历时,下标是奇数就从奇数数组依次取数据,下标是偶数就从偶数数组取数据。
耗时40 ms
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& A) {
int length = A.size();
vector<int> odd;
vector<int> even;
odd.reserve(length/2);
even.reserve(length/2);
for(int i = 0;i<length; ++i)
{
if(A[i]%2)
odd.push_back(A[i]);
else
even.push_back(A[i]);
}
int odd_index = 0;
int even_index = 0;
for(int i = 0;i<length;++i)
{
if(i%2)
{
A[i] = odd[odd_index];
odd_index++;
}else{
A[i] = even[even_index];
even_index++;
}
}
return A;
}
};
方法2:这个方法不用额外的数组。根据题目,一半是奇数,一半是偶数,所以当奇数位置上的数是偶数的话,肯定就有某一个偶数位置上的数是奇数。所以可以遍历偶数位,如果遇到奇数了,则开始遍历奇数位,然后找出奇数位上不符合的,找出了这两个数,把它们交换。
耗时40ms
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& A) {
int odd = 1;//第一个奇数下标是1
for(int even = 0;even < A.size(); even += 2)//遍历下标为偶数的数
{
if(A[even]%2)//如果现在访问的数是奇数的话
{//就停止偶数下标的访问,改成访问奇数下标
while(A[odd]%2)
odd += 2;//下标是奇数的数也为奇数的话继续向前寻找,直到遇到偶数
//当前A[odd]是偶数。将它和A[even]这个奇数交换
int tmp = A[odd];
A[odd] = A[even];
A[even] = tmp;
odd += 2;//指向下一个奇数下标
}
}
return A;
}
};