• 按奇偶排序数组 II


    922. 按奇偶排序数组 II

    给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。

    对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。

    你可以返回任何满足上述条件的数组作为答案。

     

    示例:

      输入:[4,2,5,7]
      输出:[4,5,2,7]
      解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
     

    提示:

    2 <= A.length <= 20000
    A.length % 2 == 0
    0 <= A[i] <= 1000

     代码:

    #include<iostream>
    #include<bits/stdc++.h>
    #include<vector>
    #include<iterator>
    using namespace std;
    
    vector<int> vec1,vec2,vec3;
    
    
    int main(){
        int n,num;
        cin>>n;
        for (size_t i = 0; i < n; i++)
        {
            cin>>num;
            vec1.push_back(num);        
        }
        for (vector<int>::iterator it = vec1.begin(); it != vec1.end(); it++)
        {
            if (*it&1)
            {
                vec2.push_back(*it);
            }else{
                vec3.push_back(*it);
            }
    
        }
        for (vector<int>::iterator it = vec2.begin(); it < vec2.end(); it++)
        {
            cout<<*it<<"  ";
        }   
        cout<<endl;
    
        for (vector<int>::iterator it = vec3.begin(); it <vec3.end(); it++)
        {
            cout<<*it<<"  ";
        }
        vector<int>::iterator it2=vec2.begin();
        vector<int>::iterator it3=vec3.begin();
        vec1.erase(vec1.begin(),vec1.end());
        int len=vec2.size()+vec3.size();
        for (int i = 0; i < len; i++)
        {
            if(i&1){
                vec1.push_back(*it2);
                it2++;
                continue;
            }
            vec1.push_back(*it3);
            it3++;
        }
        cout<<endl;
        for (vector<int>::iterator it = vec1.begin(); it < vec1.end(); it++)
        {
            cout<<*it<<" ";
        }
    
    }

     

     

    方法一: 两次遍历
    思路和算法

    遍历一遍数组把所有的偶数放进 ans[0],ans[2],ans[4],依次类推。

    再遍历一遍数组把所有的奇数依次放进 ans[1],ans[3],ans[5],依次类推。

    官方代码:

    void sortArrayByParityII(vector<int> vec){
        int len = vec.size();
        int *arr = new int[len+1];
        int t=0;
        for (vector<int>::iterator it = vec.begin(); it!=vec.end(); it++)
        {
            if(*it%2==0){
                arr[t]=*it;
                t+=2;
            }
        }
        t=1;
        for (vector<int>::iterator it = vec.begin(); it!=vec.end(); it++)
        {
            if(*it%2==1){
                arr[t]=*it;
                t+=2;
            }
        }
        for (int i = 0; i < len; i++)
        {
            cout<<arr[i]<<" ";
        }
    } 

    复杂度分析

    • 时间复杂度: O(N),其中 NN 是 A 的长度。

    • 空间复杂度: O(N)

     

     

    方法二: 双指针
    思路

    我们可能会被面试官要求写出一种不需要开辟额外空间的解法。

    在这个问题里面,一旦所有偶数都放在了正确的位置上,那么所有奇数也一定都在正确的位子上。所以只需要关注 A[0], A[2], A[4], ... 都正确就可以了。

    将数组分成两个部分,分别是偶数部分 even = A[0], A[2], A[4], ... 和奇数部分 odd = A[1], A[3], A[5], ...。定义两个指针 i 和 j, 每次循环都需要保证偶数部分中下标 i 之前的位置全是偶数,奇数部分中下标 j 之前的位置全是奇数。

    算法

    让偶数部分下标 i 之前的所有数都是偶数。为了实现这个目标,把奇数部分作为暂存区,不断增加指向奇数部分的指针,直到找到一个偶数,然后交换指针 i,j 所指的数。

    官方代码:

    int main(){
        int n ;
        cout<<"enter the count of the array"<<endl;
        cin>>n;
        int *arr = new int[n+1];
        for (int i = 0; i < n; i++)
        {
            cin>>arr[i];
        }
        int j =1;
        for (int i = 0; i < n; i=i+2)
        {
            if (arr[i]&1)
            {
                while (arr[j]&1)
                    j+=2;
            }
            swap(arr[i],arr[j]);
        }
        for (int i = 0; i < n; i++)
        {
            cout<<arr[i]<<" ";
        }
        
    }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13455984.html

  • 相关阅读:
    Postfix之mail.cf
    利用 Postfix 抵擋垃圾信
    安装webmin
    Win7 登入提示临时漫游档案
    squid 延伸
    禁止VMware用户在系统里删除网卡的操作的方法
    Squid Proxy Server 3.1
    使用RBL拦截垃圾邮件
    建置 POSTFIX 服务器
    Seednet 访问路径
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13455984.html
Copyright © 2020-2023  润新知