题目描述:
给定一个非负整数数组 A
,返回一个由 A
的所有偶数元素组成的数组,后面跟 A
的所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4] 输出:[2,4,3,1] 输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
提示:
1 <= A.length <= 5000
0 <= A[i] <= 5000
相关话题:数组
解题思路:
- 创建一个向量;
- 设置两个指针,一个从前往后遍历,一个从后往前遍历;
- 从前往后遍历数组中的元素;
- 如果数组中的元素是偶数,将其插入到新创建向量的左边,前指针递增,
- 如果数组中的元素是奇数,将其插入到新创建向量的右边,后指针递减。
- 返回向量的名称。
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& A) {
int size = A.size();
vector<int>result(size, 0);
int first = 0, last = size - 1;
for(int i = 0; i < size; i++){
if(A[i] % 2 == 0) {
result[first ++] = A[i];
}
else {
result[last--] = A[i];
}
}
return result;
}
};
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortArrayByParity(int* A, int ASize, int* returnSize) {
*returnSize = ASize;
int left = 0, right = ASize - 1;
while(left<right){
if(A[left] %2 == 1 && A[right] %2 == 0 ){
int temp =A[left];
A[left] = A[right];
A[right] = temp;
left++;
right--;
}
else if(A[left] %2 == 0){
left++;
}
else if(A[right] %2 == 1){
right--;
}
}
return A;
}
技术要点:双指针问题。
总结:对于数组中元素的交换问题,翻转问题,有时候用双指针法解决不失为一个简单容易的方法(黑喵白喵,抓住老鼠就是好喵)。