每日一练 2024.5.10

devtools/2024/10/9 13:26:19/
题目:

        给定一个非负整数数组 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 重新排列,使得数组中位于奇数位置的元素也是奇数,而位于偶数位置的元素也是偶数。即:

  • nums[0]nums[2]nums[4], ... 是偶数
  • nums[1]nums[3]nums[5], ... 是奇数

        这里的“位置”是基于编程语言中常用的从零开始计数的索引。

        我们可以通过一种简单的方法来实现这个要求:

  1. 初始化两个指针,evenIndex 和 oddIndex,分别用于追踪下一个应该放置的偶数和奇数的位置。
  2. evenIndex 从 0 开始,每次增加 2;oddIndex 从 1 开始,每次增加 2。
  3. 遍历数组 nums,根据当前元素是奇数还是偶数,我们放在相应的位置,并移动指针。
  4. 当两个指针都超出数组长度时,排序完成。

        考虑到进阶问题,即不使用额外空间进行排序,我们需要在原数组上进行操作。这样,我们可以在遇到不在正确位置的元素时,寻找并与其交换正确位置上的元素。 具体实现时,可以用循环或者递归的方式来进行。

代码:
class Solution {public int[] sortArrayByParityII(int[] nums) {int n = nums.length;int evenIndex = 0; // 初始化偶数位置指针int oddIndex = 1;  // 初始化奇数位置指针while (evenIndex < n && oddIndex < n) {// 同时找到错位的偶数和奇数,然后交换。if (nums[evenIndex] % 2 == 1 && nums[oddIndex] % 2 == 0) {// 交换偶数位置上的奇数和奇数位置上的偶数int temp = nums[evenIndex];nums[evenIndex] = nums[oddIndex];nums[oddIndex] = temp;evenIndex += 2;oddIndex += 2;} else {// 如果偶数位置正确,移动到下一个偶数位置if (nums[evenIndex] % 2 == 0) {evenIndex += 2;}// 如果奇数位置正确,移动到下一个奇数位置if (nums[oddIndex] % 2 == 1) {oddIndex += 2;}}}return nums; // 返回排序后的数组}
}
知识点概览:
  • 数组操作: 这是最基本也是最重要的知识点。代码中涉及到对数组的遍历和基于索引对数组元素的访问和修改。

  • 双指针技术: 双指针是一种常见的用于解决数组和链表问题的技术。在这个问题中,我们使用了两个指针(evenIndexoddIndex)来分别追踪下一个应放置偶数和奇数的位置。这两个指针按照不同的规则移动(一个跳两格,一个跳两格),分别处理偶数和奇数情况。

  • 奇偶性检查: 使用 % 模运算符检查一个数字的奇偶性。在代码中,num % 2 == 0用于检查数字是否为偶数,num % 2 == 1用于检查数字是否为奇数。

  • 条件控制: 使用 if-else 语句结构进行条件分支控制。代码中使用 if-else 来根据指针指向的元素的奇偶性决定是否进行交换,以及如何移动指针。

  • 循环控制: 使用 while 循环来重复检查和交换数组直至整个数组被正确排序。这里的循环确保了只要 evenIndex 和 oddIndex 指针未越界,就一直进行检查和可能的交换操作。

  • 变量交换: 通过使用临时变量 temp 来交换两个元素的值。这是基本的算法技巧,即使用 temp 存储一个元素的值,然后将另一个元素的值赋给这个元素,接着用 temp 的值更新另一个元素。

知识点类别详细描述
数组操作- 遍历数组。
- 基于索引对数组元素进行访问和修改。
双指针技术- 使用双指针(evenIndex 和 oddIndex)分别追踪偶数和奇数的位置。
- 指针按不同规则移动,分别处理偶数和奇数元素。
奇偶性检查- 使用 % 模运算符检查数字的奇偶性。
num % 2 == 0 检查偶数。
num % 2 == 1 检查奇数。
条件控制- 通过 if-else 语句进行条件分支控制。
- 依据元素的奇偶性决定是否交换元素,以及如何移动指针。
循环控制- 使用 while 循环,确保 evenIndex 和 oddIndex 指针未越界时,持续进行检查和交换操作。
变量交换- 使用临时变量 temp 交换两个元素的值。
- 通用的算法技巧来交换变量值。

2024.5.10


http://www.ppmy.cn/devtools/38911.html

相关文章

word 毕业论文格式调整

添加页眉页脚 页眉 首先在页面上端页眉区域双击&#xff0c;即可出现“页眉和页脚”设置页面&#xff1a; 页眉左右两端对齐 如果想要页眉页脚左右两端对齐&#xff0c;可以选择添加三栏页眉&#xff0c;然后将中间那一栏删除&#xff0c;即可自动实现左右两端对齐&#x…

笔记本电脑怎么多选删除文件?误删除文件怎么办

在日常使用笔记本电脑中&#xff0c;我们可能会遇到需要删除大量文件的情况&#xff0c;例如清理临时文件、整理文档或卸载不再需要的程序。手动一个一个地删除不仅效率低下&#xff0c;还可能遗漏某些文件。那么&#xff0c;如何在笔记本电脑上高效地进行多选删除操作呢&#…

[Unity常见小问题]打包ios后无法修改模型透明度

问题 在Editor下可以使用如下代码去修改模型的材质的透明度&#xff0c;但是打包ios后无法对透明度进行修改且没有任何warning和error using System.Collections; using System.Collections.Generic; using UnityEngine;public class NewBehaviourScript : MonoBehaviour {[R…

PyQt5中的事件与信号处理

文章目录 1. 简介1.1事件(Event)1.2 信号(Signal)与槽(Slot)1.3 自定义信号 2. 一个信号与槽的简单示例13. 一个信号与槽的简单示例24. 事件发送者5. 创建自定义信号6. 一个简单计算器 1. 简介 在PyQt5中&#xff0c;事件和信号处理是GUI编程的核心概念。事件是指用户操作或系…

山东知识付费问答系统,给孩子学习优秀的辅导班怎么选择?

现在的辅导班越来越多&#xff0c;除了兴趣爱好补习班&#xff0c;还有某一学科辅导&#xff0c;辅导班之所以这么火&#xff0c;是因为很多家长学生有这方面的需求。家长都想要自己的孩子成绩提高&#xff0c;比如数学等&#xff0c;辅导班也就越来越多&#xff0c;这么多辅导…

CSS:min-width作用

min-width作用 介绍用法举例1. 设置元素的最小宽度2. 使用百分比设置最小宽度3. 继承最小宽度 总结 介绍 在Web开发中&#xff0c;min-width 是CSS&#xff08;层叠样式表&#xff09;的一个属性&#xff0c;用于设置元素的最小宽度。当元素的宽度小于min-width属性指定的值时…

程序设计——前后端分离实现简单表白墙

文章目录 一、前端页面样式代码二、前后端衔接1. 后端创建 maven 项目2. 针对前后端交互的解释以及后端代码的实现针对 post 请求解释前后端衔接针对 Get 请求解释前后端衔接 3.后端与数据库的联系以及对数据的存取单独封装数据库连接代码解释后端存储 save 数据的代码解释后端…

OpenAI计划下周一宣布对标谷歌搜索的竞品;苹果将使用自有服务器芯片为AI工具提供支持 | 最新快讯

《科创板日报》5月10日讯 今日科创板早报的主要内容还有&#xff1a;行业协会&#xff1a;硅片价格已经脱离供需基本面运行&#xff0c;并朝向非理性方向发展&#xff1b;中芯国际、华虹公司Q1净利同比大降。 【市场动态】 OpenAI计划下周一宣布对标谷歌搜索的竞品 OpenAI计…