每日一练2024.5.9

news2024/11/24 22:25:57
题目:

给定一个非负整数数组 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.coloradmin.cn/o/1669811.html

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

相关文章

防伪溯源一体化管理系统基于FastAdmin+ThinkPHP和Uniapp(源码搭建/上线/运营/售后/维护更新)

一款基于FastAdminThinkPHP和Uniapp进行开发的多平台&#xff08;微信小程序、H5网页&#xff09;溯源、防伪、管理一体化独立系统&#xff0c;拥有强大的防伪码和溯源码双码生成功能&#xff08;内置多种生成规则&#xff09;、批量大量导出防伪和溯源码码数据、支持代理商管理…

活动预告|“AI+Security”系列第1期:大模型网络空间安全前沿探索活动火热报名中

由Wisemodel社区、安全极客主办的 “AISecurity”系列第1期&#xff1a; 大模型网络空间安全前沿探索 线下活动 将于2024年5月18日下午14:00 在苏州街16号神州数码大厦5层举行 本活动旨在汇聚业界专家和实践者共同探讨和推进AI自身安全、AI赋能安全与AI给安全带来的挑战等关…

产品设计中的“注册”说明

​在使用网站或应用的时候必不可少的就是账号系统&#xff0c;账号系统有些人可能觉得简单&#xff0c;无非就是账号密码。真的是这样吗&#xff1f; 一个完整的账号系统通常大家会分成四部分&#xff1a; 1.注册&#xff08;手机号、邮箱、用户名/密码限制/验证码&#xff09;…

项目8-头像的上传

js实现头像上传并且预览图片功能以及提交 - 掘金 (juejin.cn) 我们简单建立一个表 1.前端知识储备 1.1 addClass的使用 1.基本语法 addClass() 方法向被选元素添加一个或多个类。 该方法不会移除已存在的 class 属性&#xff0c;仅仅添加一个或多个 class 属性。 提示&…

隧道建设的数字眼睛:盾构机实时可视化技术

盾构机可视化技术可以展现盾构机在隧道掘进过程中的各项工作状态。这种技术能够将复杂的数据和参数转化为直观的图像和动画&#xff0c;包括盾构机的推进速度、土压力、刀盘转速和位置信息等关键性能指标。 通过 HT 可视化&#xff0c;工程师可以实时监控盾构机的运行状况&…

网站域名SSL证书怎么获取和安装

一、获取SSL证书 1、选择证书颁发机构&#xff08;CA&#xff09;&#xff1a; 选择一个受信任的SSL证书颁发机构&#xff0c;如JoySSL、Comodo、DigiCert、GlobalSign等。 2、生成证书签名请求&#xff08;CSR&#xff09;&#xff1a; 在您的服务商的网站上生成CSR。CSR中…

云相册APP

简介 一款用于云存照片的app&#xff0c;支持批量上传和下载照片。 平台技术 Android客户端&#xff1a;Kotlin 协程 Retrofit Server服务后端&#xff1a;Java SpringBoot 部署云服务器&#xff1a;华为云耀云服务器L实例 下载网址 小鲸鱼相册 Ps: 由于网站域名备案审核…

学校能源消耗监测管理系统,打造智能监测系统

学校能源消耗监测管理系统是一款针对&#xff0c;水、电、煤、气、热等能源的在线监测、分析与处理的系统&#xff0c;为学校管理者提供全面的能源使用情况&#xff0c;为学校管理工作提供了有力的支持。 为什么要建设能源管理系统&#xff1f; 用能需求增加 随着学校的快速…

星戈瑞SH-PEG3-OH一种多功能生物相容性PEG小分子

SH-PEG3-OH是一种含有硫基&#xff08;-SH&#xff09;、三个乙二醇单元和羟基&#xff08;-OH&#xff09;的小分子化合物。其分子结构中的硫基赋予了其独特的化学反应性&#xff0c;能够与其他含有不饱和键的化合物发生点击化学反应&#xff0c;如迈克尔加成反应等。同时&…

idea无法识别加载pom.xml文件

有时idea无法识别加载pom.xml文件&#xff0c;直接打开pom.xml文件&#xff0c;然后添加到maven就行

重塑产业效率:RFID赋能的智能挂衣系统方案

应用背景 服装生产属于劳动密集型行业&#xff0c;服装生产从原料布料开始到裁剪、打样、缝制、包烫等每个岗位都需要很多工人来作业&#xff0c;是流水式作业。尤其是缝制部门&#xff0c;每台缝纫机或其他设备都有一个工人来完成一道工序&#xff0c;比如前身&#xff0c;后…

【Redis】Redis数据类型

目录 Redis五种数据类型 String字符串类型 字符串中最常使用的命令 List列表类型 List命令 Set与Zset集合类型 Redis五种数据类型 String字符串类型 有效的字符串类型不仅可以是字符&#xff0c;还可以是数字&#xff0c;以上都是有效的字符串类型。 String最大容量为51…

局域网内访问vue3项目|Network: use --host to expose

背景 我希望在相同的局域网内&#xff0c;通过手机访问我在Vue 3项目中展示的效果 遇到的问题 使用Vue CLI的–host选项实现局域网内的应用程序测试 当使用Vue CLI在本地提供服务时&#xff0c;通过使用 --host 选项&#xff0c;你可以指定要公开应用程序的主机。默认情况下&a…

IDEA-控制台日志过滤插件 - Grep Console

IDEA-控制台日志过滤插件 - Grep Console 当idea控制台日志较多时&#xff0c;为了方便查找关键字&#xff0c;使用Grep Console插件&#xff0c;指定控制台中关键字高亮显示 1.安装 2.使用 2.1 高亮显示 控制台中指定颜色高亮显示指定字符 效果: 重启项目后还是会高亮显示 取…

线程的休眠与唤醒

在前面几篇文章中&#xff0c;已经讲过了join()方法的使用&#xff0c;我们知道它是用来控制线程的执行顺序的。 本篇文章中要讲到的wait()方法和notify()方法是用来控制线程执行顺序的&#xff0c;相比于join()&#xff0c;它能够更精确地控制线程之间的执行顺序&#xff0c;…

云仓酒庄携手中视中州国际传媒 开启央视广告战略合作新征程

近日&#xff0c;云仓酒庄与中视中州&#xff08;央视代理机构&#xff09;隆重举行2024-2025年度央视广告战略签约仪式&#xff0c;云仓酒庄副总裁周玄代表云仓酒庄签约。此次合作标志着云仓酒庄在品牌传播和市场营销方面迈出了坚实的一步&#xff0c;将借助央视及多家卫视的强…

LeetCode题目104: 二叉树的最大深度(递归\迭代\层序遍历\尾递归优化\分治法实现 )

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

数据挖掘实战-基于决策树算法构建银行贷款审批预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【系统架构师】-案例篇(一)UML用例图

1、概述 用于表示系统功能需求&#xff0c;以及应用程序与用户或者与其他应用程序之间的交互关系。 2、组成 参与者&#xff08;Actors&#xff09;&#xff1a;与系统交互的用户或其他系统。用一个人形图标表示。用例&#xff08;Use Cases&#xff09;&#xff1a;系统需要…

字符串取第一个空格之后的所有的值字符串取第一个空格之后的第二个元素的值,不要后面的值

当我们后端返回值可能存在某些特定的值或标识导致返回数据不固定且是空格分割时&#xff0c;我们想取出返回字符串中的某个值&#xff0c;就可以参考下面对这个字符串进行操作提取&#xff0c;当然&#xff0c;如果是别的符号分割开的把下面的空格替换即可 1、字符串取第一个空…