剑指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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mp4文件和3gp文件的区别「建议收藏」

    Mp4文件和3gp文件的区别「建议收藏」相同:3GP/MP4都是文件容器。不同:3GP是通信公司制定的规范主要用在手机上这种移动通讯设备上,所以对文件内包含的音视频编码格式定义的非常死.这样手机只要支持固定的几种codec就可以放3g

    2022年7月2日
    24
  • 中标麒麟安装deb命令_麒麟源码

    中标麒麟安装deb命令_麒麟源码**中标麒麟NeoKylin-SDK里都有哪些库文件**下边是中标麒麟1-8和14的安装包内容。希望对中标麒麟开发的同学能有些帮助。[root@bogonNeoKylin-SDK]#shinstall.shPleaseselectwhichgroupyouwanttoinstall:1)C-development5)gnome-soft…

    2022年8月10日
    94
  • 4G技术TDD和FDD分别指什么「建议收藏」

    4G技术TDD和FDD分别指什么「建议收藏」TDD和FDD分别指什么;   TDD(Time Division Duplexing)时分双工技术,在移动通信技术使用的双工技术之一,与FDD相对应。   在TDD模式的移动通信系统中,基站到移动台之间的上行和下行通信使用同一频率信道(即载波)的不同时隙,用时间来分离接收和传送信道,某个时间段由基站发送信号给移动

    2022年6月9日
    62
  • Windows 7系统DNS服务器配置方法

    Windows 7系统DNS服务器配置方法DNSDNS域名系统。域名系统是一个有序、结构化系统用于计算机与互联网或连接在一个私密网络系统。每个参与者补充了一个域名,代表不同的信息。电脑系统要求数字IP地址的功能。然而,这显然是非常困难的,对一些IP地址的门外汉来说,DNS可以翻译处容易记住的域名,DNS的重要性在于它是一个目录服务的互联网。正如电话目录翻译的人的名字到他们的电话号码,DNS也是这样,它们会翻译IP地

    2022年5月22日
    37
  • 【Tools】Ubuntu20.04安装VMware Tools详解

    【Tools】Ubuntu20.04安装VMware Tools详解00.目录文章目录00.目录01.VMwareTools简介02.VMwareTools功能03.VMwareTools安装方法一05.VMwareTools安装方法二06.附录01.VMwareTools简介VMwareTools中包含一系列服务和模块,可在VMware产品中实现多种功能,从而使用户能够更好地管理客户机操作系统,以及与客户机操作系统进行无缝交互。VMwareTools生命周期管理为VMwareTools的安装和升级提供了一种简单而可扩展的

    2022年5月9日
    456
  • Unity 渲染 YUV[通俗易懂]

    Unity 渲染 YUV[通俗易懂]YUVYUV和RGB一样,是另一套用来表达颜色的方案。其详细叙述请参阅[YUV的维基](https://en.wikipedia.org/wiki/YUV)欢迎使用Markdown编辑器加粗样式你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器,可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Mar…

    2022年7月16日
    13

发表回复

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

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