剑指Offer面试题:11.调整数组顺序使奇数位于偶数前面建议收藏

一题目:调整数组顺序使奇数位于偶数前面二解题思路如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

一 题目:调整数组顺序使奇数位于偶数前面

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

二 解题思路

  如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于每碰到一个偶数就需要移动O(n)个数字,因此总的时间复杂度是O(n2)

  这里可以参考快速排序的思想,快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的

    剑指Offer面试题:11.调整数组顺序使奇数位于偶数前面建议收藏

三 代码实现

void Swap(int *p, int *q)
{
    int temp = *p;
    *p = *q;
    *q = temp;
}

void ResetArray(int a[], int nLen)
{
  if (NULL == a || nLen <= 0)
    {
        return;
    }
int *left = a; int *right = &a[nLen -1]; while (left < right) { while(*left % 2 && (left < right)) { left ++; } while ((*right % 2) == 0 && (left < right)) { right --; } Swap(left++, right--); } } void main() { int a[] = {1,2,3,4,5,6,7,8,9}; ResetArray(a, 9); return; }

四 可扩展实现

  如果把题目改成把数组中的数分为两部分,能被3整除的数都在不能被3整除的数的前面。面对需求的变化,我们发现代码变化的部分很小,因此从可扩展性的角度考虑,我们可以改写上面的代码如下,这里利用回调函数来实现。

typedef bool (*Proc)(int *);
bool CmpCondition_1(int *p)
{
    if (*p % 2)
    {
        return true;
    }
    
    return false;
}

bool CmpCondition_2(int *p)
{
    if (*p % 3)
    {
        return false;
    }

    return true;
}

void ResetArray(int a[], int nLen, Proc fun)
{
    if (NULL == a || nLen <= 0 || NULL == fun)
    {
        return;
    }
    int *left = a;
    int *right = &a[nLen -1];
    while (left < right)
    {
        while(fun(left) && (left < right))
        {
            left ++;
        }
        while (!fun(right)&& (left < right))
        {
            right --;
        }

        Swap(left++, right--);
    }
}

void PrintArry(int *a, int nLen)
{
    for (int i = 0;i < nLen; i ++)
    {
        cout << a[i] << " ";
    } 

    cout << endl;
}

void main()
{
    int a[] = {1,2,3,4,5,6,7,8,9};
    cout <<"原始数组:";
    PrintArry(a, 9);
    ResetArray(a, 9,CmpCondition_1);
    cout <<"奇数放前面,偶数方面:";
    PrintArry(a, 9);
    ResetArray(a, 9,CmpCondition_2);
    cout <<"被3整除的放前面:";
    PrintArry(a, 9);
    return;
}

剑指Offer面试题:11.调整数组顺序使奇数位于偶数前面建议收藏

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120163.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 云打码实现验证码识别功能_打验证码赚钱真的吗

    云打码实现验证码识别功能_打验证码赚钱真的吗云打码官网:http://www.yundama.com/API接口:http://www.yundama.com/apidoc/YDM_SDK.html#DEMO以下验证码识别使用的”pythonHTTP“方法:1.注册开发者账号,进入开发者中心,点击”我的软件“→”添加新软件“,获取软件代码和通讯密钥;2.调用示例:importhttp.client,mimetype…

    2025年8月19日
    5
  • 协方差矩阵计算方法[通俗易懂]

    协方差矩阵计算方法[通俗易懂]1.协方差矩阵X,YX,YX,Y是两个随机变量,X,YX,YX,Y的协方差Cov(X,Y)Cov(X,Y)Cov(X,Y)定义为:cov(X,Y)=E[(X−μx)(Y−μy)]cov(X,Y)=E[(X-\mu_x)(Y-\mu_y)]cov(X,Y)=E[(X−μx​)(Y−μy​)]其中:E(X)=μx,E(Y)=μyE(X)=\mu_x,E(Y)=\mu_yE(X)=…

    2022年6月28日
    26
  • outsystems

    outsystemsoutsystems从入门到精通-朱家俊的文章-知乎https://zhuanlan.zhihu.com/p/322582052outsystemsoutsystemsoutsystemsoutsystemsoutsystemsoutsystems

    2025年8月16日
    3
  • Android开发:用adb命令安装apk到手机

    Android开发:用adb命令安装apk到手机一、首先需要准备一个apk以及真机(我们以真机为例,就不说明模拟器了),然后adbdevices查看手机是否连接,直接输入adbdevices即可,如图:显示上图信息,说明连接成功,就可以推送安装apk了。如果出现下图,则可参照https://blog.csdn.net/y201314an/article/details/81022556进行修改环境变量…

    2022年4月29日
    146
  • cdn加速配置_自己配置cdn

    cdn加速配置_自己配置cdn配置方法同上篇文章一样CDN加速配置,阿里云cdn内配置好以后即可剩下把前端服务器nginx内的证书文件上传以及配置写好即可。后端服务器也同上配置证书下载上传服务器配置好nginx即可。如果都配置好以后,不可以访问时,注意查看前端请求接口是否为https方式。如果为http时,检查是否更新服务器成功,如果成功后还不可以正常访问时,前端修改代码如下:vue.config.js内添加下行代码。index.html下添加代码:https:true完毕!…

    2022年8月19日
    25
  • 用了vue还需要jquery吗_vue与react的区别

    用了vue还需要jquery吗_vue与react的区别⾸先呢jquery他是⽤js封装的⼀个类库,主要是为了⽅便操作dom元素,⽽vue他是⼀个框架,并且呢,他会从真实dom构建出⼀个虚拟的dom树,通过di!算法渲染只发⽣改变的dom元素,其他的相同的dom元素不⽤在重新渲染.⽽使⽤jquery去改变dom元素的时候,即使有相同的dom元素也会重新渲染,jq重点操作dom,而vue重点操作数据。以上就是我对vue和jquery区别的理解….

    2022年10月15日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号