剑指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)
上一篇 2021年12月19日 下午2:00
下一篇 2021年12月19日 下午3:00


相关推荐

  • jquery nextsibling_javascript中预编译

    jquery nextsibling_javascript中预编译JavaScript中的nextSibling和previousSibling和作用类似于jquery的next()和prev(),都是获取下一个/上一个同胞元素,如果下一个同级节点不存在,则此属性返

    2022年8月2日
    11
  • 快速排序quicksort_快速排序的原理

    快速排序quicksort_快速排序的原理一、简介快速排序是(Quicksort)是对冒泡排序的一种改进,是非常重要且应用比较广泛的一种高效率排序算法。二、算法思路快速排序是通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序。大致步骤如下:首先设置一个分界值也就是基准值又是也称为监视哨,通过该分界值将数据分割成两部分。将大于或等于分界值的数据集中到右边,小于分界值的数据集中到左边。一趟排序过后,左边部

    2022年8月12日
    7
  • delphi webbrowser 经常用法演示样例

    delphi webbrowser 经常用法演示样例

    2021年12月5日
    46
  • 华为vlan配置

    华为vlan配置介绍本实验全部使用华为模拟器 eNSP 进行完成 一 实现同个 vlan 不同网段的主机互通 1 拓扑图 2 案例 LSW1 交换机配置 1 任意创建 vlan 这里演示 vlan100 Huawei vlan1002 进入 vlan100 配置 IP 注意第二个 IP 后面加 sub Huawei interfaceVla Huawei Vlanif100 ipaddress192 168 1

    2026年3月20日
    3
  • html css制作404页面,一款纯css3实现的漂亮的404页面

    html css制作404页面,一款纯css3实现的漂亮的404页面实现的代码。html代码:404ERRORLost?MaybeIcanhelp.required/>SearchMySuggestions.HomePortfoliocss3代码:body{background-color:#0A7189;color:#fff;font:100%”Lato”,sans-serif;font-size:1.8r…

    2022年7月27日
    14
  • Java中File使用–创建文件「建议收藏」

    Java中File使用–创建文件「建议收藏」1.错误示范1,输出的是创建文件夹D:\filepath\test\test.txt。publicclassFileTest{publicstaticvoidmain(String[]args)throwsIOException{StringfileName=”test.txt”;FiletestFile=new…

    2022年6月23日
    26

发表回复

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

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