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

1 问题

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分,比如数组{6、 5 、1、 4、2 、7 、3、8、9}我们调整后变成这样{9、5、1、3、7 、2 、4 、8、6}   

 

 

 

2 分析

我们利用partition算法博客可以知道,这里还是利用两个指针,一个指针指向开始,一个指针指向尾巴,分别从两边进行扫描,我们先从尾巴指针向左移动,发现了奇数就暂停这里,然后开始移动首指针,如果发现是偶数了就保存当前指针,然后和之前扫描到奇数位置进行换位置,终止条件是首指针的值等于尾指针的值。

 

 

 

 

3 代码实现

#include <iostream>
#include <vector>using namespace std;void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}void printVector(vector<int> v) 
{for (int i = 0; i < v.size(); ++i){std::cout << v[i] << "\t";}std::cout << std::endl;
}/**奇数在偶数前面的函数*/
void reorderOddEven(vector<int>& vector)
{if (vector.size() <= 0){std::cout << "vector.size is <= 0" << std::endl;return;}int start = 0;int end = vector.size() - 1;while (start < end){while (start < end && (vector[end] % 2) == 0){--end;}while (start < end &&  (vector[start] % 2) != 0){++start;   }swap(vector[start], vector[end]);}
}int main()
{vector<int> v2;v2.push_back(6);v2.push_back(5);v2.push_back(1);v2.push_back(4);v2.push_back(2);v2.push_back(7);v2.push_back(3);v2.push_back(8);v2.push_back(9);vector<int> v3;printVector(v2);reorderOddEven(v2);printVector(v2);return 0;
}

 

 

 

 

4 运行结果

6	5	1	4	2	7	3	8	9	
9	5	1	3	7	2	4	8	6	

 

 

 

 

5 优化

比如我们还有类似的问题,比如数组里面有负数和整数,我们要求负数在正数前面,我么知道reorderOddEven函数里面只要把(vector[start] % 2) != 0这个条件进行修改就行,这里我么可以使用函数指针,根据不同的需求传递不同的函数指针下来,达到效果,增加部分代码实现如下。

#include <iostream>
#include <vector>using namespace std;void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}void printVector(vector<int> v) 
{for (int i = 0; i < v.size(); ++i){std::cout << v[i] << "\t";}std::cout << std::endl;
}bool isOddEvenNumber(int number)
{return ((number & 0x1) == 0);
}bool isNagetiveNumber(int number)
{if (number > 0)return true;elsereturn false;
}void reorderOddEvenOne(vector<int>& vector, bool (*func)(int))
{if (vector.size() <= 0){std::cout << "vector.size is <= 0" << std::endl;return;}int start = 0;int end = vector.size() - 1;while (start < end){while (start < end && (*func)(vector[end])){--end;}while (start < end && !(*func)(vector[start])){++start;   }swap(vector[start], vector[end]);}
}int main()
{vector<int> v2;v2.push_back(6);v2.push_back(5);v2.push_back(1);v2.push_back(4);v2.push_back(2);v2.push_back(7);v2.push_back(3);v2.push_back(8);v2.push_back(9);vector<int> v3;printVector(v2);reorderOddEvenOne(v2, isOddEvenNumber);printVector(v2);return 0;
}

运行结果如下

6	5	1	4	2	7	3	8	9	
9	5	1	3	7	2	4	8	6	

如果我们要实现负数在前面的数组,我们只需要调用reorderOddEvenOne函数传递isNagetiveNumber作为函数指针就行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

负基础学python编程_【数据科学系统学习】Python # 编程基础[二]

在上一篇中我们讲到了函数&#xff0c;如果你想在所编写的别的程序中重用一些函数的话&#xff0c;应该怎么办&#xff1f;正如你可能想象到的那样&#xff0c;答案是模块(Modules)。我们这一篇就从模块说起。模块为了编写可维护的代码&#xff0c;我们把很多函数分组&#xff…

【JX4G】JX4G摄影测量工作站快捷键大全

本文章总结了JX4G数字摄影测量工作站中常用的快捷键及其用法。 JX4G快捷键一览表序号快捷键作用描述1X删除可以框选&#xff0c;右键删除2C强制闭合可以闭合等高线等3S图形映射开关控制二维图形在三维立体中的显示4Z输入高程值可锁定高程5T流线和折线之间互换流线和折线之间互换…

python3 最简单的实现 模版设计模式

在项目开发过程时&#xff0c;遇见某些子类的逻辑处理流程大致相同&#xff0c;可是用模板模式减少代码冗余&#xff0c;降低耦合。 例如实现某一窗体或者页面启动时&#xff0c;第一步需要加载启动界面图片资源&#xff0c;第二步加载个人信息&#xff0c;第三步加载个人钱包…

《代码整洁之道》读书笔记-1

前言&#xff1a;我最近在读《代码整洁之道》这本书&#xff0c;在读的过程中发现如果只是读&#xff0c;不动手做点什么的话&#xff0c;总感觉少了点什么&#xff0c;于是就写点总结&#xff0c;给自己加深印象。当然&#xff0c;本文只是理论&#xff0c;不会讨论如何写出整…

什么是Freedoc?Freedoc是什么?

本文讲的是什么是Freedoc&#xff1f;Freedoc是什么&#xff1f;&#xff0c;【IT168 资讯】Freedoc是刘鹏提出的一个概念&#xff0c;其目的是建立一种简易的免费文档共享和版权保护机制。  Freedoc的想法来自Freeware和开源软件&#xff1a;既然大量软件可以免费合法共享&a…

玩转CSS选择器(一) 之 使用方法介绍

前言 前几天整理了CSS一些技术关键字&#xff0c;但是因为自己的知识过于单薄&#xff0c;觉得考虑的不充分有欠缺&#xff0c;随后便在sf.gg提出了这个问题《关于CSS核心技术关键字都有哪些&#xff1f;》&#xff0c;也是为了让厉害的人一起参与进来&#xff0c;用他们的经验…

php基础-1

//echo "hello","aaaa";//输出语法&#xff0c;可以输出多个字符串//print "world"; //可以输出&#xff0c;只能输出一个字符串 用"."拼接可以输出&#xff0c;用","拼接直接报错 //数据类型 int,double,float,string,char…

工业相机和普通相机的区别详解_数码单反相机和胶片单反相机的区别

从相机出世到现在&#xff0c;相机的种类可以分为两种&#xff0c;一个是早期的胶片相片&#xff0c;另一个是现在的数码相机&#xff0c;数码相机的种类也是有很多种&#xff0c;其中最为常见就是单反相机了。那么今天我们就来看看胶片机和单反的区别。相机的种类总的来说可以…

剑指offer之二进制中1的个数

1 问题 实现一个函数&#xff0c;输入一个函数&#xff0c;输出该二进制数据中1的个数。例如9表示二进制数据1001&#xff0c;有2位是1&#xff0c;因此输入9&#xff0c;该函数会输出2。 2 分析 我们先了解下计算机里面位运算&#xff0c;有5种 1&#xff09;& 这个是与…

ArcGIS 10.6 Data Interoperability Tools的安装与使用(附安装包下载)

ArcGIS平台中提供了一个数据交互操作工具Data Interoperability Tools,安装Desktop的时候不是一并安装的,这样导致Data Interoperability Tools工具箱下的工具(如Quick Import)全面有一个红色的叉号,无法正常使用,解决办法是手动安装Data Interoperability Tools,位于软…

女朋友强依赖我!我引入IOC后,从此我们的关系微妙而稳固!

此文从面向对象设计角度分析依赖倒置原则&#xff0c;引入依赖注入&#xff0c;IOC相关内容进行探讨&#xff0c;文中引用女朋友案例可能引起分手风险&#xff0c;故理解为 new 对象。想起在学校的时候&#xff0c;有一个任务就是设计一款宠物商店项目。那时候引入三层架构设计…

Qt 第二步 槽与信号(一) 实现点击按钮并弹窗

信号与槽是Qt中的核心&#xff0c;也是Qt的特有的。在Qt中信号与槽的关键字为slots、signals、emit。 具体信号与槽将会在下一节中详细说明&#xff0c;因为担心一些读者在没了解过槽与信号前直接讲述过深导致门槛提高&#xff0c;阅读困难&#xff0c;所以当前这一篇文将在不理…

mvc 返回一个对象 到视图接收

public ActionResult InfoFrame() { List<Users> list new List<Users>(); Users user new Users(); if (Session["UserID"] null)//判断是否没登录 { return RedirectToAction("LoginIndex", "Login"); } else { string sql st…

CAD格式数据转ArcGIS数据方法总结

本文总结CAD数据转换为ArcGIS支持数据格式的常见几种方法。 目录 1. 在CASS软件中,导出为shp格式 2. 在ArcGIS软件中加载(Add Data)DWG格式的CAD数据 3. 使用ArcGIS提供的Conversion Tools

语言 分组计算hr_干货 | HR不得不知的面试技巧

面试是求职者倍感煎熬的时刻&#xff0c;但其实&#xff0c;面试也让不少HR们颇有压力。毕竟&#xff0c;要在短时间内快速了解一个人&#xff0c;并判断是否适合岗位、业务部门会不会满意、能不能适应企业文化等并不容易。所以&#xff0c;今天Anna给大家整理了一份面试问题汇…

剑指offer之求数组里面只出现一次的的两个数据

1 问题 一个整型数组里除了两个数字之外&#xff0c;其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 2 分析 第一种方法&#xff1a;我们用位运算 我们想到位运算 &#xff08;1&#xff09; a^a0&#xff08;2&#xff09;a^0a&#xff08;2&#xff09;a…

python3 爬虫第一步 简单获取网页基本信息

注&#xff1a;本系列专栏需要有简单的python3 语言基础 爬虫的相关作用在此就不再说明&#xff0c;相信能够点进该系列文章的读者都已经了解了爬虫是什么&#xff0c;并且能够做什么。由于是发布在互联网的文章&#xff0c;所以系列文章都不以书籍的方式从头到尾的叙述作用及其…

将旧版 WCF 应用程序迁移到 CoreWCF

前言CoreWCF 项目团队发布了 CoreWCF 的 1.0 版本&#xff0c;这是 WCF 到 .NET Core 平台的移植。我觉得&#xff0c;CoreWCF 适用于这类场景使用——基于 WCF 的旧版应用程序已在 Windows 平台上运行了很多年&#xff0c;但是希望将代码迁移到 .NET Core&#xff0c;以利用 L…

C语言中的短路现象

C语言短路现象讲解 - 短路现象 1 表达式1 && 表达式2 && 表达式3; 分析&#xff1a; 只有当表达式1为真&#xff08;非0&#xff09;时才需要判断表达式2的值&#xff1b;只有表达式1和2都为真&#xff08;非零&#xff09;时&#xff1b;才需要判断表达式3的…

记录我的学习历程--二维数组解决平面图形题

打印出3 7 2 4 6 81 5 9代码如下转载于:https://blog.51cto.com/4139737/1684269