输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
解:
我的思想:准备两个容器,一个装奇数,一个装偶数,最后组合一下.
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
vector<int>v1;
vector<int>v2;
for(int i=0;i<nums.size()%50000;i++)
{
if(nums[i]%10000%2==0)
{
v1.push_back(nums[i]%10000);
}else
{
//这里总是会出错!不能用v2,只能用v1
v2.push_back(nums[i]%10000);
}
}
//主要原因是下面这个范围不正确
for(int i=0;i<v2.size()%50000;i++)
{
v2.push_back(v1[i]%10000);
}
return v2;
}
};
不需要后面有10000,50000的范围,定义了两个i变量,要把一个换成j
修改后:
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
vector<int>v1;
vector<int>v2;
for(int i=0;i<nums.size();i++)
{
if((nums[i]&1)==0)
{
v1.push_back(nums[i]);
}else
{
v2.push_back(nums[i]);
}
}
//v2.resize(v1.size()+v2.size());
for(int j=0;j<v1.size();j++)
{
v2.push_back(v1[j]);
}
return v2;
}
};
简单的方法:
定义头指针 left,尾指针 right.
left 一直往右移,直到它指向的值为偶数
right 一直往左移, 直到它指向的值为奇数
交换 nums[left]和 nums[right]
重复上述操作,直到 left == right==right .
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int left=0;
int right=nums.size()-1;
while(right>left)
{
//左边本来就放奇数
if((nums[left]&1)==1)//奇数
{
left++;
continue;//循环中跳出本次循环,直接进入下一次循环
}
//右边放偶数
if((nums[right]&1)==0)//偶数
{
right--;
continue;//循环中跳出本次循环,直接进入下一次循环
}
//如果左边是偶数右边是奇数,交换一下
swap(nums[left++],nums[right--]);
}
return nums;
}
};
快慢指针法:
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int low = 0, fast = 0;
while (fast < nums.size()) {
if (nums[fast] & 1) {
swap(nums[low], nums[fast]);
low ++;
}
fast ++;
}
return nums;
}
};