1. 题目
给你一个整数数组
nums
,将nums
中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。返回满足此条件的 任一数组 作为答案。
2. 示例
3. 分析
开辟一个数组res用来保存操作过后的元素。第一次遍历数组只插入偶数,第二次遍历数组只插入奇数。
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& nums) {
vector<int> res;
for (int i = 0; i < nums.size(); i++)
{
if (num % 2 == 0) res.push_back(num[i]);
}
for (int i = 0; i < nums.size(); i++)
{
if (num % 2 == 1) res.push_back(num[i]);
}
return res;
}
};
能不能只遍历一次数组?可以滴。遇到偶数,替换到res数组偶数区间,即左侧区间;遇到奇数,替换到res数组奇数区间,即右侧区间。
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& nums) {
int n = nums.size();
vector<int> res(n);
int left = 0, right = n - 1;
for (int i = 0; i < n; i++)
{
if (num[i] % 2 == 0) res[left++] = num[i];
else res[right--] = num[i];
}
return res;
}
};
前面两种方法都需新开辟一个数组,那能不能不开辟而是原地进行替换?那是可以滴。
定义两个指针,左指针跳过偶数寻找奇数,右指针跳过奇数寻找偶数,交换左右指针元素。
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& nums) {
int n = nums.size();
int left = 0, right = n - 1;
while(left < right)
{
while(left < right && nums[left] % 2 == 0) left++;
while(left < right && nums[right] % 2 == 1) right--;
swap(nums[left++], nums[right--]);
}
return nums;
}
};
或者只用一个指针 j 用来表示元素为奇数。遍历数组寻找到偶数后,交换二者元素即可。思想上感觉都差不多=.= ,只是更简洁~~~
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& nums) {
int n = nums.size();
int j = 0;
for(int i = 0; i < n; i++)
{
if(nums[i] % 2 == 0) swap(nums[i], nums[j++]);
}
return nums;
}
};