调整数组顺序使奇数位于偶数前面

【转】http://zhedahht.blog.163.com/blog/static/25411174200741295930898/

 

题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。

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

要求的是把奇数放在数组的前半部分,偶数放在数组的后半部分,因此所有的奇数应该位于偶数的前面。也就是说我们在扫描这个数组的时候,如果发现有偶数出现在奇数的前面,我们可以交换他们的顺序,交换之后就符合要求了。

因此我们可以维护两个指针,第一个指针初始化为数组的第一个数字,它只向后移动;第二个指针初始化为数组的最后一个数字,它只向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针指向的数字是偶数而第二个指针指向的数字是奇数,我们就交换这两个数字。

基于这个思路,我们可以写出如下的代码:

void Reorder(int *pData, unsigned int length, bool (*func)(int));
bool isEven(int n);

/////////////////////////////////////////////////////////////////////////
// Devide an array of integers into two parts, odd in the first part,
// and even in the second part
// Input: pData  - an array of integers
//        length - the length of array
/////////////////////////////////////////////////////////////////////////
void ReorderOddEven(int *pData, unsigned int length)
{
      if(pData == NULL || length == 0)
            return;

      Reorder(pData, length, isEven);
}

/////////////////////////////////////////////////////////////////////////
// Devide an array of integers into two parts, the intergers which
// satisfy func in the first part, otherwise in the second part
// Input: pData  - an array of integers
//        length - the length of array
//        func   - a function
/////////////////////////////////////////////////////////////////////////
void Reorder(int *pData, unsigned int length, bool (*func)(int))
{
      if(pData == NULL || length == 0)
            return;

      int *pBegin = pData;
      int *pEnd = pData + length - 1;

      while(pBegin < pEnd)
      {
            // if *pBegin does not satisfy func, move forward
            if(!func(*pBegin))
            {
                  pBegin ++;
                  continue;
            }

            // if *pEnd does not satisfy func, move backward
            if(func(*pEnd))
            {
                  pEnd --;
                  continue;
            }

            // if *pBegin satisfy func while *pEnd does not,
            // swap these integers
            int temp = *pBegin;
            *pBegin = *pEnd;
            *pEnd = temp;
      }
}

/////////////////////////////////////////////////////////////////////////
// Determine whether an integer is even or not
// Input: an integer
// otherwise return false
/////////////////////////////////////////////////////////////////////////
bool isEven(int n)
{
      return (n & 1) == 0;
}

讨论:

上面的代码有三点值得提出来和大家讨论:

1.函数isEven判断一个数字是不是偶数并没有用%运算符而是用&。理由是通常情况下位运算符比%要快一些;

2.这道题有很多变种。这里要求是把奇数放在偶数的前面,如果把要求改成:把负数放在非负数的前面等,思路都是都一样的。

3.在函数Reorder中,用函数指针func指向的函数来判断一个数字是不是符合给定的条件,而不是用在代码直接判断(hard code)。这样的好处是把调整顺序的算法和调整的标准分开了(即解耦,decouple)。当调整的标准改变时,Reorder的代码不需要修改,只需要提供一个新的确定调整标准的函数即可,提高了代码的可维护性。例如要求把负数放在非负数的前面,我们不需要修改Reorder的代码,只需添加一个函数来判断整数是不是非负数。这样的思路在很多库中都有广泛的应用,比如在STL的很多算法函数中都有一个仿函数(functor)的参数(当然仿函数不是函数指针,但其思想是一样的)。如果在面试中能够想到这一层,无疑能给面试官留下很好的印象。

青龙人形机器人硬件平台设计全解析:从构型到控制系统的实战指南 本文深度解析了青龙人形机器人硬件平台的设计全流程,从需求分析、构型设计到核心系统实现。文章详细阐述了其43个自由度的仿生构型、高动态性下肢设计、灵巧作业系统以及分布式控制架构,并探讨了旋转关节与直线关节等关键技术选型,为开发者提供了从理论到实践的完整硬件设计指南。 阅读详情

相关推荐

【数学模型】灰色关联分析

数学模型-灰色关联分析

suic009的博客 1万+

PTA 调整数组使奇数全部都位于偶数前面其他数字顺序不变

题目: 输入一个长度不超过10的数字字符串,调整数组使奇数全部都位于偶数前面其他数字顺序不变。 输入格式: 例如输入“0123456789” 输出格式: 输出“1357902468” 输入样例: 在这里给出一组输入。例如: 0123456789 输出样例: 在这里给出相应的输出。例如: 1357902468 源代码: 思路一 #include<stdio.h> #include <string.h> int main() { char arr1[1

Gankpro的博客 3347

车辆贷款违约预测挑战赛

2021科大讯飞-车辆贷款违约预测挑战赛--方案简介车贷违约预测问题,目的是建立风险识别模型来预测可能违约的借款人。预测结果为借款人是否可能违约,属于二分类问题。偏数据挖掘的比赛,关键点是如何基于对数据的理解抽象归纳出有用的特征。站在大佬的视角,尝试学习总结,站在巨人的肩膀上,也许看得会更远一些。直接进入主题,开始学习套路,芜湖~特征工程1、常用库、数据导入import pandas as pd import numpy as np import lightgbm as lgb import xgboost

平平淡淡,戒急用忍,一生学闭嘴。 3341

程序员面试题精选(29):调整数组顺序使奇数位于偶数前面

题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。分析:如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于碰到一个偶数,需要移动O(n)个数字,因此总的时间复杂度是O(

yysdsyl的专栏 2180

AI辅助SCI论文大修:一键生成回复信+同步修改稿,效率提升300%

AI可以针对多位审稿人的意见进行逐点(point-by-point)回复,语言地道流畅,能够处理邮件格式、礼貌性回复和部分内容修正。最新的LLM:GPT-5, Claude 4.1都是带有agentic功能,能规划复杂任务,并调用工具执行复杂任务的大模型。有时候审稿人意思模棱两可,你的反复揣摩ta关注的点是什么,回复的不好,很有可能下一轮被reject。这个2.0升级版,除了在response中完美rebuttle,在文中对应部分的修改,也会帮你一并呈现,基本上就是可以直接拿来用的版本;

dinaxuejie的博客 1666

UE5在Ubuntu22.04.4下的高效开发环境配置指南

本文详细介绍了在Ubuntu 22.04.4系统上配置UE5高效开发环境的完整指南,包括系统准备、显卡驱动安装、UE5引擎编译与配置、开发工具链设置以及性能优化技巧。通过逐步指导,帮助开发者快速搭建稳定的UE5开发环境,解决常见问题,提升开发效率。

weixin_29251131的博客 383

一个数组把偶数放在奇数的前面

介绍两种算法: 第一种是分别从数组的两边的下标开始,最前面的下标依次递增,如果碰到偶数继续遍历,如果碰到奇数则停止循环,记住当前位置。最后面的下标依次递减,如果碰到奇数继续遍历,如果碰到了偶数停止循环。当两个循环都停止之后,一个是奇数,一个偶数,这个时候互换它们的位置。 比如说一个数组 int【】 a={1,2,3,4,5}; 整个过程如图所示,第一个是奇数1,循环停止,后边的第一个是5继续,然...

shoushou_的博客 1202

金蝶ERP元数据解析:字段属性与表结构映射实战

本文深入解析金蝶ERP元数据的核心价值与应用实践,详细介绍了字段属性与表结构映射的关键技术。通过缓存获取与工具类直连两种方案对比,结合实际案例展示元数据在数据库校验、动态表单生成等场景的应用,帮助开发者高效解决二次开发中的常见问题。

weixin_33738555的博客 433

7-16 调整数组使奇数全部都位于偶数前面其他数字顺序不变 (8分) 输入一个长度不超过10的数字字符串,调整数组使奇数全部都位于偶数前面其他数字顺序不变。 输入格式: 例如输入“012345678

输入一个长度不超过10的数字字符串,调整数组使奇数全部都位于偶数前面其他数字顺序不变。 输入格式: 例如输入“0123456789” 输出格式: 输出“1357902468” 输入样例: 在这里给出一组输入。例如: 0123456789 输出样例: 在这里给出相应的输出。例如: 1357902468 #include<stdio.h> int main() { int huhu[10], haha[10]; char lala[10]; int i, j = 0, n, num=0; scanf

bk2012333的博客 2244

【嵌入式】AMIC和DMIC(什么是数字麦和模拟麦)

最近在做一个关于MIC的项目,同事不太清楚AMIC和DMIC的区别,又有高手详细解释了其原理,在此整理记录一下,方便后续查阅。

Bigan(安)的博客 8551

手把手完整实现STM32+NB-IoT+MQTT+ThingsCloud云平台+手机APP(Android或iOS)及微信小程序及Web app 应用

本教程以远程温湿度显示及点灯作为示例。最终效果实现本地OLED显示屏、云平台和手机APP、微信小程序和Web App可远程查看温湿度数据,并可远程控制LED灯亮灭。以此完成基于MQTT协议的NB-IoT远程发布订阅数据,以此在本教程基础上可扩展开发更多的功能。

嵌入式阿齐Archie 2万+

【剑指offer】调整数组顺序使奇数位于偶数前面

剑指offer题解:调整数组顺序使奇数位于偶数前面

weixin_63449996的博客 1129

VSS shielding线可以floating吗?

shielding vss不打孔,就相当于dummy metal,如果周围有其他干扰线,他们影响了这段dummy metal,这段dummy metal仍然会对目标线产生干扰,bug的是,工具知道这段dummy是vss,那么计算寄生的时候仍然把它当vss,就有可能噪声没有完全消除,而用户又看不见。而真正接地的线,相当于一直是0,就不会对目标线产生干扰,一般加shield是在route之前,这时候shield能尽量覆盖目标线,等到绕线后再加就会出现shield只覆盖到一部分目标线的情况。

m0_61544122的博客 6637

剑指offer-调整数组顺序使奇数位于偶数前面

7.调整数组顺序使奇数位于偶数前面 题目内容: 代码及思路: 1.用最基础的遍历的方式,即遍历数组若是奇数则取出,偶数后之。 #include<iostream> #include<vector> using namespace std; class solution { public: void reorderarray(vector<int>...

larklili的博客 174

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

js剑指offer-13-调整数组顺序使奇数位于偶数前面

剑指offer13-调整数组顺序使奇数位于偶数前面 题目描述   输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 const reOrderArray = array =&gt; { const jishu = []; const oushu = []; ...

julian_draxler的博客 798

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

python数组排序奇数在前偶数在后_调整数组顺序使奇数位于偶数前面

调整数组顺序使奇数位于偶数前面C++ Solution1class Solution {public:void reOrderArray(vector &array) {for (int i = 0; i{for (int j = array.size()-1; j>i; j--){if ((array[j] & 0x01) == 1 && (array[j...

weixin_39886251的博客 1228

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

调整数组顺序使得奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。 代码: /* 调整数组顺序使得奇数位于偶数前面 by Rowandjj 2014/8/1 */ #include #include using namespace std; //高效解法,但会调整后的数组元素相对顺序会发生改变 void func(int *

RowandJJ 1264

剑指Offer.21——调整数组顺序使奇数位于偶数前面

题目链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/ 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 输入:nums = [1,2,3,4] 输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。 解题过程: 第一次: 使用两个数组分开存,然后再合并。天真的我以

学而不思则忘 339

调整数组顺序让奇数位于偶数前面

牛客 剑指offer.JZ13调整数组顺序让奇数位于偶数前面一、思路分析二、代码实现1.代码如下2.知识点补充 调整数组顺序让奇数位于偶数前面 一、思路分析 题意:区分出奇数和偶数,按照原顺序奇数偶数顺序不变 我的思路:开辟两组新的空间,我这里用的是LinkedList,因为想要用到队列的先进先出方法 1、先找出奇数利用2余某个数不为零就是奇数(这里不考虑0的情况),那么余2是0那就是偶数啦 2、然后奇数放在一个链表里面,偶数放在一个链表里面。链表不需要事先知道长度大小,所以用链表方便,数组是没法确定大

weixin_43558210的博客 369

牛客网&剑指Offer&调整数组顺序使奇数位于偶数前面

牛客网&剑指Offer&调整数组顺序使奇数位于偶数前面 代码实现1 class Solution { public: void reOrderArray(vector<int> &array) //引用array数组 { if(array.empty()) //empty()作为判断容器是否为空的函数,若为空则为true r...

weixin_42060900的博客 255

【数组】调整数组顺序使奇数位于偶数前面

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 import java.util.LinkedList; public class Solution { public void reOrderArray(int [] array) { ...

永生只是一场幻梦 2833

剑指Offer_21_调整数组顺序使奇数位于偶数前面

package 二刷; /** * https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/ * * @author Qitong!! * @Date 2020/7/2 */ public class 剑指Offer_21_调整数组顺序使奇数位于偶数前面 { public int[] exchange(int[] nums) { /

qitong啊的博客 480
上一篇: 从尾到头输出链表
下一篇: 二元树的深度
caoruntaogmail
博客等级 码龄18年 3粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值