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;}
};