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

算法的学习笔记—调整数组顺序使奇数位于偶数前面(牛客JZ21)

img

😀前言
在数据处理和算法问题中,经常需要对数组进行特定的调整或排序。本文将介绍如何调整一个整数数组的顺序,使得所有的奇数位于数组的前半部分,而所有的偶数位于数组的后半部分,并且保持奇数和奇数、偶数和偶数之间的相对顺序不变。

🏠个人主页:尘觉主页

文章目录

  • 😀调整数组顺序使奇数位于偶数前面
    • 题目链接
    • 😁题目描述
    • 😍示例
      • 示例1
      • 示例2
      • 示例3
    • 🥰解题思路
      • 💓题思路
      • 💞方法一:使用额外空间
          • 💕步骤:
        • ❤️‍🔥代码实现:
      • 💞方法二:原地调整
        • 💕步骤:
        • ❤️‍🔥代码实现:
        • 分析:
    • 😄比较与总结

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

题目链接

牛客网

😁题目描述

输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

数据范围:0≤n≤5000,数组中每个数的值 0≤val≤10000

要求:时间复杂度 O(n),空间复杂度 O(n)

进阶:时间复杂度 O(n2),空间复杂度 O(1)

😍示例

示例1

输入:[1,2,3,4]
返回值:[1,3,2,4]

示例2

输入:[2,4,6,5,7]
返回值:[5,7,2,4,6]

示例3

输入:[1,3,5,6,7]
返回值:[1,3,5,7,6]

需要保证奇数和奇数,偶数和偶数之间的相对位置不变,这和书本不太一样。例如对于 [1,2,3,4,5],调整后得到 [1,3,5,2,4],而不能是 {5,1,3,4,2} 这种相对位置改变的结果。

d03a2efa-ef19-4c96-97e8-ff61df8061d3

🥰解题思路

💓题思路

为了解决这个问题,有两种常见的方法:使用额外的空间创建新数组,或在原数组上进行调整。下面将详细介绍这两种方法。

💞方法一:使用额外空间

通过使用额外的空间,可以在O(n)的时间复杂度内完成调整,同时保持原有的相对顺序。

💕步骤:
  1. 遍历数组,统计奇数的个数,并创建一个与原数组大小相同的副本。
  2. 重新遍历数组,将奇数按顺序放在副本的前半部分,偶数放在副本的后半部分。
  3. 将副本中的元素按顺序放回原数组。
❤️‍🔥代码实现:
public int[] reOrderArray (int[] nums) {// 奇数个数int oddCnt = 0;for (int x : nums)if (!isEven(x))oddCnt++;int[] copy = nums.clone();int i = 0, j = oddCnt;for (int num : copy) {if (num % 2 == 1)nums[i++] = num;elsenums[j++] = num;}return nums;
}private boolean isEven(int x) {return x % 2 == 0;
}

分析

  • 时间复杂度:O(n),遍历数组两次。
  • 空间复杂度:O(n),因为需要额外的空间来存储副本。

💞方法二:原地调整

如果对空间复杂度有更高的要求,可以选择在原数组上进行调整。我们可以借助冒泡排序的思想,每次将当前的偶数向后交换,直至它被排到最后一位。

💕步骤:
  1. 从右向左遍历数组,每次遇到偶数时,将其与后面的元素交换,直至它后面紧跟的元素为奇数。
  2. 重复上述操作,直到所有的偶数都排到数组的右端。
❤️‍🔥代码实现:
public int[] reOrderArray(int[] nums) {int N = nums.length;for (int i = N - 1; i > 0; i--) {for (int j = 0; j < i; j++) {if (isEven(nums[j]) && !isEven(nums[j + 1])) {swap(nums, j, j + 1);}}}return nums;
}private boolean isEven(int x) {return x % 2 == 0;
}private void swap(int[] nums, int i, int j) {int t = nums[i];nums[i] = nums[j];nums[j] = t;
}
分析:
  • 时间复杂度:O(n^2),因为需要进行多次遍历和交换操作。
  • 空间复杂度:O(1),没有使用额外的空间。
  • 时间换空间

😄比较与总结

这两种方法各有优缺点。如果需要快速调整且不在意空间开销,可以选择方法一,它在O(n)的时间内完成排序。而如果对空间复杂度要求更高,可以选择方法二,它在原数组上操作,但需要O(n^2)的时间。

在实际应用中,可以根据具体需求选择合适的方法。如果数组较小且对空间要求严格,方法二可能更合适;如果数组较大且需要更快的处理速度,方法一是更优的选择。

通过这两种方法,我们可以有效地调整数组中的奇偶顺序,满足特定的排序需求。这种调整方式在数据处理、算法设计中有着广泛的应用,掌握这些技巧可以为解决复杂问题提供思路和方法。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CSS的:valid和:invalid伪类:增强表单验证的视觉反馈
  • PyTorch 基础学习(7)- 自动微分
  • 【计算机人接私活】手把手教你上手挖到第一个漏洞,从底薪3k到月入过万,只有一步之遥!
  • C语言 ——— 枚举类型的定义及其优点
  • Qt-多种方式实现helloworld(6)
  • 技术周总结08.12-08.18周日(C#开发环境搭建 Linux命令)
  • 蓝图中结构体改变后,要重新创建widget
  • 系统开发之禁止卸载应用名单
  • 图卷积(GCN)
  • 第一章——数组基础(概念篇python版)
  • Android+Jacoco+code-diff全量、增量覆盖率生成实战
  • 共享经济背景下校园、办公闲置物品交易平台-计算机毕设Java|springboot实战项目
  • 系统架构设计师 - 软件工程(2)
  • Mysql面试一
  • 【数据结构算法经典题目刨析(c语言)】使用栈实现队列(图文详解)
  • 时间复杂度分析经典问题——最大子序列和
  • [译]CSS 居中(Center)方法大合集
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Akka系列(七):Actor持久化之Akka persistence
  • Create React App 使用
  • Django 博客开发教程 8 - 博客文章详情页
  • eclipse(luna)创建web工程
  • gops —— Go 程序诊断分析工具
  • IDEA 插件开发入门教程
  • iOS编译提示和导航提示
  • Java到底能干嘛?
  • java中具有继承关系的类及其对象初始化顺序
  • Redash本地开发环境搭建
  • SOFAMosn配置模型
  • ubuntu 下nginx安装 并支持https协议
  • Vultr 教程目录
  • windows下使用nginx调试简介
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 码农张的Bug人生 - 见面之礼
  • 如何胜任知名企业的商业数据分析师?
  • ###C语言程序设计-----C语言学习(6)#
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (待修改)PyG安装步骤
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (九)c52学习之旅-定时器
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (十八)Flink CEP 详解
  • (十八)SpringBoot之发送QQ邮件
  • (一)插入排序
  • (转)项目管理杂谈-我所期望的新人
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .cfg\.dat\.mak(持续补充)
  • .libPaths()设置包加载目录
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net MySql
  • .NET处理HTTP请求
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • ??javascript里的变量问题