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


相关推荐

  • 线程的停止与暂停

    线程的停止与暂停1.停止线程停止线程不像停止一个循环break一样干脆。停止一个线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前的操作。虽然看起来简单,但是必须做好正确的防范措施,以便达到预期的效果

    2022年7月2日
    22
  • webpack 核心_学术界最重要的价值基础是

    webpack 核心_学术界最重要的价值基础是前言本质上,webpack是一个用于现代JavaScript应用程序的静态模块打包工具。当webpack处理应用程序时,它会在内部构建一个依赖图(dependencygraph),此

    2022年7月29日
    3
  • linux下的rar命令,Linux下的压缩解压命令「建议收藏」

    linux下的rar命令,Linux下的压缩解压命令「建议收藏」1.Linuxzip命令压缩zip-rfilename.zip./*//将当前目录下的所有文件和文件夹全部压缩成filename.zip文件-r表示递归压缩子目录下所有文件解压unzip-dtestfilename.zip//把filename.zip文件解压到./test-d:-dtest指明将文件解压缩到….

    2022年7月11日
    20
  • tof测距精度可以达到多少_毫米波雷达成像

    tof测距精度可以达到多少_毫米波雷达成像Tof,结构光,三角测距,RGBD,双目,激光雷达,毫米波雷达一文总结距离测量算法解析TOF飞行时间测距法超声波毫米波雷达激光雷达最近在做一些无人车相关的工作,对其中的一些基础技术做了些总结和归纳,主要涉及以下技术,将会分两篇文章进行介绍超声波测距毫米波雷达激光雷达固态雷达RGBD摄像头双目摄像头单目摄像头TOF飞行时间三角测距结构光虽然这些词汇一起出现的频率很…

    2022年9月15日
    0
  • linux 查看Java 进程的内存使用情况[通俗易懂]

    linux 查看Java 进程的内存使用情况[通俗易懂]top-b-n1|grepjava|awk'{print”PID:”$1″,mem:”$6″,CPUpercent:”$9″%”,”mempercent:”$10″%”}’…

    2022年8月23日
    5
  • 中文金融领域情感词典构建「建议收藏」

    中文金融领域情感词典构建「建议收藏」2019年10月4日-6日Python爬虫与文本分析工作坊&课题申报高级研修班这篇文章是公众号关注者郝童鞋今早发给我的,在此谢谢郝童鞋。文章基于简单算法和人工…

    2022年8月23日
    6

发表回复

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

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