当前位置: 首页 > news >正文

C++:调整数组顺序使奇数位于偶数前面【面试】

在C++,如果要调整数组顺序使所有奇数位于偶数前面,这里提供一种简单且常用的方法:双指针技术。这种方法不需要额外的空间,并且时间复杂度为O(n)。

以下是使用双指针技术实现的示例代码:

#include <iostream>
#include <vector>
#include <algorithm> // 用于std::swapvoid rearrangeArray(std::vector<int>& nums) {int left = 0; // 奇数的起始指针int right = nums.size() - 1; // 偶数的起始指针while (left < right) {// 左指针向右移动,寻找第一个偶数while (left < right && nums[left] % 2 != 0) {++left;}// 右指针向左移动,寻找第一个奇数while (left < right && nums[right] % 2 == 0) {--right;}// 如果左右指针没有交错,交换两个数if (left < right) {std::swap(nums[left], nums[right]);++left;--right;}}
}int main() {std::vector<int> nums = {1, 4, 3, 6, 9, 2, 7, 8};rearrangeArray(nums);std::cout << "Array after rearrangement: ";for (int num : nums) {std::cout << num << " ";}return 0;
}

这段代码中,我们使用了两个指针leftright。初始时,left指向数组的开始,right指向数组的末尾。然后我们分别从左右两边向中间扫描:

  • left从左到右找到第一个偶数。
  • right从右到左找到第一个奇数。

找到之后,交换这两个数。然后继续这个过程,直到leftright相遇或交错。

这种方法保证了所有的奇数在数组的前半部分,偶数在后半部分,满足了题目要求。

面试回答示例:
"要解决这个问题,我们可以使用双指针技术。首先,我们初始化两个指针,一个指向数组的开始,另一个指向数组的末尾。然后,我们分别从数组的两端向中间扫描,左边的指针寻找偶数,右边的指针寻找奇数。一旦找到,我们就交换这两个数的位置。我们重复这个过程,直到两个指针交错或相遇。这种方法不需要额外的存储空间,并且时间复杂度为O(n),是一种高效且常用的解决方案。"

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 创新共享经济:探索Web3对新商业模式的启迪
  • 【Python入门与进阶】Python函数的定义与使用
  • 随手记:商品信息过多,展开收起功能
  • Java-集合类-Arrays.asList()使用需要注意的大坑
  • 综合数据分析及可视化实战
  • 力扣hot100:394. 字符串解码(递归/括号匹配,字符串之间相对顺序)
  • 放弃Venn-Upset-花瓣图,拥抱二分网络
  • 无公网IP与服务器完成企业微信网页应用开发远程调试详细流程
  • 36、matlab矩阵特征值、特征向量和奇异值
  • 【python】在【机器学习】与【数据挖掘】中的应用:从基础到【AI大模型】
  • 基于MCGS的双容水箱液位控制系统设计【MCGS+MATLAB+研华工控机】
  • 【第六篇】SpringSecurity的权限管理
  • Mac 下载并激活IDEA
  • 【深度学习】深入解码:提升NLP生成文本的策略与参数详解
  • 代码解读 | Hybrid Transformers for Music Source Separation[05]
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • avalon2.2的VM生成过程
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • flask接收请求并推入栈
  • MySQL主从复制读写分离及奇怪的问题
  • PHP的类修饰符与访问修饰符
  • PHP那些事儿
  • 番外篇1:在Windows环境下安装JDK
  • 翻译--Thinking in React
  • 基于游标的分页接口实现
  • 简单实现一个textarea自适应高度
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 算法---两个栈实现一个队列
  • 物联网链路协议
  • 小程序开发之路(一)
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 原生 js 实现移动端 Touch 滑动反弹
  • 走向全栈之MongoDB的使用
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #if 1...#endif
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)Nginx简介和安装教程
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (规划)24届春招和25届暑假实习路线准备规划
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)C#调用WebService 基础
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)程序员疫苗:代码注入
  • .mysql secret在哪_MySQL如何使用索引
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net IOC框架入门之一 Unity
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET/C# 使用反射注册事件
  • .NET6 命令行启动及发布单个Exe文件