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


相关推荐

  • mybatis-plus mapper-locations(grbl源码分析)

    BaseMapper接口继承该接口后,无需编写mapper.xml文件,即可获得CRUD功能publicinterfaceBaseMapper<T>{/***<p>*插入一条记录*</p>**@paramentity实体对象*/intinsert(Tentity);/***<p>*根据ID删除

    2022年4月17日
    152
  • LAMP配置-nginx.conf「建议收藏」

    LAMP配置-nginx.conf「建议收藏」#usernobody;worker_processes8;worker_cpu_affinity0000000100000010000001000000100000010000001000000100000010000000;error_loglogs/error.logcrit;pidlogs/nginx.pid;worker_rlimit_nofile65535;events{useepoll;worker_c.

    2022年6月5日
    28
  • eclipse的svn切换账号_eclipse将项目和svn关联

    eclipse的svn切换账号_eclipse将项目和svn关联百度搜了下全都是不知道哪年的一篇博客被疯狂转载,删除缓存文件的。但是根本不顶用。直接上我的解决方案吧(来自stackoverflow)。

    2022年10月14日
    2
  • 网络爬虫——scrapy入门案例

    网络爬虫——scrapy入门案例一、概述Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试.其最初是为了页面抓取(更确切来说,网络抓取)所设计的,后台也应用在获取API所返回的数据(例如AmazonAssociatesWebServices)或者通用的网络爬虫.Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider

    2022年6月26日
    29
  • css animation动画(css3动画分享)

    css3小动画,实在是丰富了前端展示页面的效果。虽然IE8不兼容(爱兼容不兼容,奏是这么傲娇)。但是在谷歌,火狐表现都没差。今天就介绍一个css3动画小插件,分分钟满足你实现各种妖魔化动画效果。1.需要引入css文件:animate.css2.引入js文件:wow.min.js3.找到页面中需要添加动画的元素添加class;比如:wowfadeInRightanimatedan…

    2022年4月15日
    66
  • windows10adb环境配置(adb shell命令)

    win10最新版adb环境变量配置

    2022年4月10日
    325

发表回复

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

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