每日一练2024.5.9

题目:

给定一个非负整数数组 nums,  nums 中一半整数是 奇数 ,一半整数是 偶数 。

对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。

你可以返回 任何满足上述条件的数组作为答案 。

示例 1:

输入:nums = [4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

示例 2:

输入:nums = [2,3]
输出:[2,3]

提示:

  • 2 <= nums.length <= 2 * 104
  • nums.length 是偶数
  • nums 中一半是偶数
  • 0 <= nums[i] <= 1000

进阶:可以不使用额外空间解决问题吗?

解题:

        这道题的目标是重新排序给定的非负整数数组nums,使数组满足特定的位置规则:位于偶数索引的元素是偶数,位于奇数索引的元素是奇数。根据题目的提示,我们知道数组长度是偶数,且一半元素是偶数,另一半是奇数。解决这个问题有几种方法:

  1. 两个指针法:利用两个指针,一个只在偶数索引移动,一个只在奇数索引移动。交换两个指针指向的不符合位置要求的数。

  2. 分类后重组:创建两个数组,一个存放所有的偶数,另一个存放所有的奇数,最后交替把它们重组到原数组中。

对于进阶问题:题目询问你是否能在不使用额外空间的情况下解决这个问题。可以运用第一种方法(两个指针法),因为这种方法不需要创建额外的数组,直接在原数组上进行操作即可。步骤大致如下:

  1. 初始化两个指针,evenIndex从0开始(用于偶数索引),oddIndex从1开始(用于奇数索引)。
  2. 遍历数组直至evenIndex或者oddIndex到达数组末尾。
  3. evenIndex指向的数字是奇数,且oddIndex指向的数字是偶数时,则交换这两个数。
  4. 如果evenIndex指向的数字已经是偶数,则evenIndex增加2;同理,如果oddIndex指向的数字是奇数,则oddIndex增加2。
  5. 重复步骤3和4,直到整个数组被正确排序。

实现这个算法,只需要在原数组上进行指针移动和元素交换操作,不会占用除输入数组以外的额外空间,因此是一个原地排序算法。

代码:
class Solution {public int[] sortArrayByParityII(int[] nums) {int n = nums.length;int evenIndex = 0; // 偶数索引int oddIndex = 1;  // 奇数索引while (evenIndex < n && oddIndex < n) {// 寻找错位的偶数索引while (evenIndex < n && nums[evenIndex] % 2 == 0) {evenIndex += 2;}// 寻找错位的奇数索引while (oddIndex < n && nums[oddIndex] % 2 != 0) {oddIndex += 2;}// 交换if (evenIndex < n && oddIndex < n) {int temp = nums[evenIndex];nums[evenIndex] = nums[oddIndex];nums[oddIndex] = temp;}}return nums;}
}
知识点概览:

        这段代码是为了解决一个特定的问题,即在给定的非负整数数组中,按照特定规则重新排序数组,使偶数索引处的元素为偶数,奇数索引处的元素为奇数。这个问题的解决方法采用了就地排序的策略,意味着不需要额外的数组来存储结果,而是直接在输入数组上操作。这里用到的主要Java编程知识点包括:

  1. 数组:使用数组来存储输入的整数序列。数组是一种基本的数据结构,支持通过索引快速访问元素。

  2. 变量:定义了几个整型变量(nevenIndexoddIndex)用于存储数组长度和控制循环中的索引位置。

  3. 循环控制(while循环和嵌套while循环):使用两层while循环来遍历数组并找到需要交换的元素位置。外层循环控制整个过程直到所有元素被正确排序,内层循环分别找到不在正确位置的偶数元素和奇数元素。

  4. 条件判断(if语句):利用if语句和求余运算符%来检查元素是否符合其索引的奇偶性要求。

  5. 算术运算:使用%求余运算符来判断数字的奇偶性(偶数 % 2 == 0,奇数 % 2 != 0)。

  6. 变量交换:在找到不符合位置要求的一对偶数索引和奇数索引的元素后,通过临时变量temp执行数组内元素的交换。

  7. 空间复杂度控制:这个解决方案遵循就地操作的原则,除了原数组以外,不需要分配额外的空间来存储数据或结果,因此空间复杂度为O(1)。

  8. 索引控制:通过精确地控制evenIndexoddIndex,保证了即使发生了交换操作,也能再次回到循环中继续寻找下一个不在正确位置上的元素。这里的索引控制确保了算法的完整性和效率。

知识点类别描述
数组使用数组存储输入的整数序列,支持通过索引快速访问元素。
变量定义整型变量(例如nevenIndexoddIndex)来存储数组长度和控制索引位置。
循环控制使用while循环及嵌套while循环遍历数组并查找需要交换的元素位置。外层循环控制整个过程,内层循环分别寻找错位的偶数和奇数元素。
条件判断利用if语句合并求余运算符%判断元素与其索引奇偶性是否匹配。
算术运算使用%求余运算符判断数字的奇偶性(偶数为% 2 == 0,奇数为% 2 != 0)。
变量交换在找到不符合位置要求的元素对时,通过临时变量temp执行数组内的元素交换。
空间复杂度控制整个算法运行过程中,除原数组外没有使用额外的存储空间,空间复杂度为O(1)。
索引控制精确控制evenIndexoddIndex确保算法能继续寻找不在正确位置的元素,这种控制方式保证了算法的完整性和效率。

fb14efc1f6f34b2daefee3768bb6b90d.png

 2024.5.9

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

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

相关文章

自制无感无刷电机驱动板

自制无感无刷电机驱动板 分别测试了基于C251的STC32G单片机、Arduino AVR的ATmega328PB、以及ARM的ST32F103单片机。 &#x1f9f2;测试转动效果 ✒目前市面上开源的有关无刷电机的项目数不胜数&#xff0c;其控制原理都大同小异&#xff0c;在没有领透其技术要领情况下&#x…

缩短项目周期:SOLIDWORKS Electrical简化了电气设计过程

在现代工业设计领域&#xff0c;电气系统设计的复杂性日益增加&#xff0c;然而&#xff0c;达索系统SOLIDWORKS Electrical软件的出现为这一挑战提供了高效的解决方案。该软件支持工程师通过选配的方式快速设计原理图&#xff0c;这极大地简化了电气设计过程&#xff0c;并有效…

SpringAMQP-消息转换器

这边发送消息接收消息默认是jdk的序列化方式&#xff0c;发送到服务器是以字节码的形式&#xff0c;我们看不懂也很占内存&#xff0c;所以我们要手动设置一下 我这边设置成json的序列化方式&#xff0c;注意发送方和接收方的序列化方式要保持一致 不然回报错。 引入依赖&#…

html5的一些新特性

最近总是碰到html5特性这种问题,虽然简单,但是也是自己平时不关注的东西,趁今天时间充裕,那就来总结一下吧 HTML5新特性包括新增了部分标签、表单元素增强、支持视频和音频、支持canvas绘图、提供web存储、提供地理定位功能、提供web workers机制、提供web socket协议、提供CS…

python-Centos上安装Jupyter Notebook

文章目录 安装 Miniconda安装 Jupyter Notebook配置远程访问打开lab 安装 Miniconda Miniconda 是一个小型的版本&#xff0c;包含 conda 包管理器和 Python&#xff0c;非常适合管理和隔离 Python 环境。你可以从 Miniconda 官网下载适合 CentOS 7 的安装脚本&#xff0c;然后…

企业网站慎用免费SSL证书!OV证书才是首选

市面上有很多免费证书提供&#xff0c;免费的SSL证书更适用于个人博客、学生学习、测试等应用场景。如果您的网站是企业网站一定慎用免费的SSL证书&#xff0c;而是选择企业级的OV证书。 一&#xff0e;免费SSL证书的风险 1安全性&#xff1a;免费SSL证书通常只提供基本的加密…

SpringBoot对接微信公众平台(1)--- 配置微信公众平台测试号URL并校检

SpringBoot对接微信公众平台&#xff08;1&#xff09;--- 配置微信公众平台测试号URL并校检 说明微信公众号接口测试号申请后端代码实现内网穿透接口测试 说明 这里记录下自己学习SpringBoot对接微信公众平台的成长过程&#xff0c;以防止后面继续踩坑且方便以后直接使用。这…

突破传统:精酿啤酒的创新与变革

在啤酒的世界中&#xff0c;传统与创新始终是并存的。Fendi club啤酒作为精酿啤酒的代表&#xff0c;不仅继承了传统的酿造工艺&#xff0c;更在创新与变革方面做出了突破。 Fendi club啤酒在原料选择上进行了创新。除了使用大麦、酵母和啤酒花等传统原料外&#xff0c;Fendi c…

适用于无线通信设备的小尺寸温补晶振TG2016SLN

爱普生新推出一款2016小尺寸温补晶振TG2016SLN&#xff0c;TG2016SLN是EPSON推出的频率范围为10MHz~55.2MHz的温度补偿型晶体振荡器TCXO&#xff0c;工作温度可达105℃。产品采用无铅材料&#xff0c;符合ROHS标准&#xff0c;对环境友好&#xff0c;具有待机功能&#xff0c;待…

sCrypt受邀在中国人民大学举办《区块链与数字经济》课程讲座

4月17日&#xff0c;可一科技特邀美国sCrypt公司的开发工程师周全&#xff0c;在中国人民大学的《区块链与数字经济》课程上进行了讲座。周全讲解了区块链的分布式设计、不可篡改特性&#xff0c;以及智能合约的基本原理&#xff0c;利用“智能家居触发机制”等生动比喻&#x…

如何3分钟快速训练一个属于自己的(暴躁老哥、猫娘)AI大模型?(弱智吧经典问题为例)

首先我们进入谷歌Gemini&#xff1a;Gemini - Google DeepMind 然后我们进入官网看见左边的几个选项 选择Create new prompt创建新的提示 选择结构化提示 点击action可以增加列&#xff0c;也就是设置更多回答或者选项 那么那个温度&#xff08;Temperature&#xff09;是什么…

记一次特别的未授权访问

某个夜里&#xff0c;随手点进去的一个小程序&#xff0c;引发的连锁反应。 开局一个小程序&#xff1a; 登录方式令人发愁&#xff0c;尝试收集&#xff0c;无果。 数据交互的地方说不定有sql&#xff0c;再次尝试&#xff0c;还是无果。 复制连接去web端&#xff0c;看看…