• 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。


    题目:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。

    要求:空间复杂度O(1),时间复杂度为On)。

    分析:分别从数组两端向中间推进。推出条件为左右相撞

              当左端值为偶数,并且右端值为奇数时交换二值,用到一个临时空间。

              当左端值为奇数,向右推进一个单位

              当右端值为偶数,向左推进一个单位

    我最开始写的代码:

    void order(int* arr,int n)
    {
        int i=0,j=n-1;
         while(i<=j) // =可去掉,只剩一个元素就不用操作了。改成i<j
        {
            bool iEven=(arr[i]%2==0);
            bool jEven=(arr[j]%2==0);
            if(iEven && jEven)
            {
                j++;
            }
            else if(iEven && !jEven)
            {
                swap(arr[i],arr[j]);
                i++;
                j--;
            }
            else if(!iEven && jEven)
            {
                i++;
                j--;
            }
            else if(!iEven && !jEven)
            {
                i++;
            }
         }
    }
     

    上面的代码虽然正确,但总感觉有点啰嗦,网上面看的答案有点比较简洁:

    #include<iostream>
    using namespace std;
    #define odd(s) (s%2)?1:0  //奇数
    #define even(s) (s%2)?0:1  //偶数
    void order2(int* arr,int n)
    {
        int i=0,j=n-1;
        bool iEven,jEven;
        while(i<j)
        {
            if( even(arr[i]) && odd(arr[j]))
            {
                int tmp=arr[i];arr[i]=arr[j];arr[j]=tmp;
            }
            if(odd(arr[i]))
            {
                i++;
            }
            if(even(arr[j]))
            {
                j--;
            }
        }
    }
    
    int main()
    {
         int arr[] = {1,2,3,4,5};
      int length = sizeof(arr)/sizeof(arr[0]);
       order(arr,length);
       for(int i=0;i<length;i++)
           cout<<arr[i]<<ends;
       cout<<endl;
    }

    输出:1 5 3 4 2

  • 相关阅读:
    IEE754算法
    EQ控制卡二次开发(火凤凰、蓝精灵异步单双色控制卡卡)
    康耐德C2000开关量采集
    初次了解MVC框架模式
    jQuery常用事件
    jQuery做一个小小的移动图片的位置
    jQuery关于复选框的基本小功能
    WebRequest类: WebRequest类是.NET.Framework的请求/响应模型的抽象基类,用于访问Internet数据
    .net与三层的异同
    mvc基础
  • 原文地址:https://www.cnblogs.com/youxin/p/3291354.html
Copyright © 2020-2023  润新知