题目链接:
题目内容:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
提示:
0 <= nums.length <= 50000
0 <= nums[i] <= 10000
自己思路:双指针
一个left指针指向数组的头,一个right指针指向数组的尾。
遍历数组:如果left指向元素为奇数,那么left++;如果right指向元素为偶数,那么right--;如果left指向元素为偶数,且right指向元素为奇数,那么交换left和right指向的元素,然后left++、right--。
补充,交换两个元素的值可以直接用swap()函数。
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
// 数组长度可以为0
// 所有数组元素为非负整数
// 数组长度为0 或 1
if(nums.size() <= 1) return nums;
// 数组长度大于等于 2
int left = 0;
int right = nums.size() - 1;
while(left < right){
if(nums[left] % 2 == 1) left++;
if(nums[right] % 2 == 0) right--;
if(left >= right) break; // 需要判断此时while条件是否还成立 不成立就break
// left此时指向偶数 right此时指向奇数
if(nums[left] % 2 == 0 && nums[right] % 2 == 1){
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;
right--;
}
}
return nums;
}
};
官方题解:
题解一:两次遍历
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
// 官方题解一 两次遍历
// 新建一个ans数组 遍历两次nums 第一次遍历把所有奇数放入ans数组,第二次遍历把所有偶数放入ans数组
vector<int> ans;
for(int i = 0;i < nums.size();i++){
if(nums[i] % 2 == 1) ans.push_back(nums[i]);
}
for(int i = 0;i < nums.size();i++){
if(nums[i] % 2 == 0) ans.push_back(nums[i]);
}
return ans;
}
};
题解二:双指针+一次遍历
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
// 官方题解二 双指针+一次遍历
// 新建一个ans数组 并且指定大小
// 两个指针left、right分别指向ans数组的头和尾
// 遍历nums数组,如果当前元素为奇数,存在left指针指向位置,如果当前元素为偶数,存在right指针指向位置
vector<int> ans(nums.size());
int left = 0;
int right = nums.size() - 1;
for(auto num : nums){
if(num % 2 == 1) ans[left++] = num;
if(num % 2 == 0) ans[right--] = num;
}
return ans;
}
};