调整该数组中数字的顺序,使得所有奇数位于数组的前半部分(C++)

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

示例:

输入: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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值