每日一练 2024.5.10

news2024/9/29 19:14: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.coloradmin.cn/o/1662740.html

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

相关文章

景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!

随着无人机技术的不断发展与革新&#xff0c;它已成为现代社会中一个前景无限的科技领域。 无人机应用领域 边境巡逻与安防&#xff1a;边境管理部门利用无人机监控边境线&#xff0c;防止非法越境和其他安全威胁&#xff0c;同时也能监控地面安保人员的工作状态和行动路线。 …

双目相机标定流程(MATLAB)

一&#xff1a;经典标定方法 1.1OPENCV 1.2ROS ROS进行双目视觉标定可以得到左右两个相机的相机矩阵和畸变系数&#xff0c;如果是单目标定&#xff0c;用ROS会非常方便。 3.MATLAB标定&#xff08;双目标定&#xff09; MATLAB用来双目标定会非常方便&#xff0c;主要是为…

【oj题】环形链表

目录 一. OJ链接&#xff1a; 环形链表 【思路】 快慢指针 ​编辑【扩展问题】 为什么快指针每次走两步&#xff0c;慢指针走一步可以解决问题&#xff1f; ​编辑【扩展问题】快指针一次走3步&#xff0c;走4步&#xff0c;...n步行吗&#xff1f; 二. OJ链接&#xff1a…

2024年第九届“数维杯”大学生数学建模挑战赛B题

第一个问题为&#xff1a;正己烷不溶物对热解产率是否产生显著影响&#xff1f; 第一个问题&#xff1a;正己烷不溶物(INS)对热解产率是否产生显著影响&#xff1f; 解析&#xff1a;正己烷不溶物(INS)主要是由生物质和煤中的非挥发性物质组成&#xff0c;它们在共热解过程中会…

Django 静态文件管理与部署指南

title: Django 静态文件管理与部署指南 date: 2024/5/10 17:38:36 updated: 2024/5/10 17:38:36 categories: 后端开发 tags: WebOptCDN加速DjangoCompressWebpackStaticDeployCICD-ToolsSecStatic 第一章&#xff1a;介绍 Django 静态文件的概念和重要性 在 Web 开发中&a…

【Docker】Docker部署Java程序

Maven中使用打包插件 <build><finalName>duanjian</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass…

一次完整的GC流程

Java堆中内存区分 Java的堆由新生代&#xff08;Young Generation&#xff09;和老年代&#xff08;Old Generation&#xff09;组成。新生代存放新分配的对象&#xff0c;老年代存放长期存在的对象。 新生代&#xff08;Young&#xff09;由年轻区&#xff08;Eden&a…

Blender细节补充

1.饼状菜单&#xff0c;用于快速切换/选择 例如&#xff1a; ~&#xff1a;切换视图 Z&#xff1a;切换着色方式 &#xff0c;&#xff1a;切换坐标系 .&#xff1a;切换基准点 Shift S&#xff1a;吸附 有两种使用方式&#xff1a; -点选 -滑选&#xff0c;按快捷键…

手机一键换ip地址到湖南

怎么把手机ip改成湖南&#xff1f;想要手机一键换ip地址到湖南&#xff0c;可以试试使用虎观代理app&#xff0c;一键操作&#xff0c;简单又方便。你会惊讶地发现&#xff0c;更改手机IP至湖南竟然如此便捷。 选用APP优势&#xff1a; ★IP资源丰富 已经在国内各大省份提供服…

Fastapi+docker+tortoise-orm+celery

因为项目是后期引入celery,所以导致构建docker的时候只有fastapi的项目&#xff0c;celery的重启比较麻烦 1.docker安装celery pip install celery安装celery的时候注意python版本与celery版本的适配&#xff0c;有些celery的版本不支持python的版本&#xff0c;具体的版本请看…

泰迪智能科技携手新乡学院开展“泰迪智能双创工作室”共建交流会

为深化校企合作&#xff0c;实现应用型人才培养目标。5月8日&#xff0c;广东泰迪智能科技股份有限公司河南分公司市场总监张京瑞到访新乡学院数学与统计学院参观交流&#xff0c;数学与统计学院院长赵国喜、副院长皮磊、张秦&#xff0c;教研室主任许寿方、姚广出席本次交流会…

【基础算法总结】二分查找一

二分查找一 1. 二分查找2.在排序数组中查找元素的第一个和最后一个位置3.x 的平方根4.搜索插入位置 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1…

Dependencies:查找项目中dll关联文件是否缺失。

前言 Dependencies工具作为一款优秀的DLL解析工具&#xff0c;能让你很直观地看到DLL的相关信息&#xff0c;如具备哪些功能函数、参数&#xff0c;又比如该DLL基于哪些DLL运行。判断该dll基于哪些dll运行&#xff0c;如果基于的dll丢失&#xff0c;那么就会提示。就能判断缺少…

RobbitMQ基本消息队列的消息接收

1.先给工程引入依赖 父工程有了子工程就不用导了 <!--AMQP依赖&#xff0c;包含RabbitMQ--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.配置yml…

前端组件库图片上传时候做自定义裁剪操作

不论是vue还是react项目&#xff0c;我们在使用antd组件库做上传图片的时候&#xff0c;有一个上传图片裁剪的功能&#xff0c;但是这个功能默认是只支持1:1的裁剪操作&#xff0c;如何做到自定义的裁剪操作&#xff1f;比如显示宽高比&#xff1f;是否可以缩放和旋转操作&…

vue 中的 Vuex

Vuex Vuex是什么&#xff1f; 概念&#xff1a;专门在vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理(读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间…

【二叉树算法题记录】二叉树的所有路径,路径总和——回溯

目录 257. 二叉树的所有路径题目描述题目分析cpp代码 112. 路径总和题目描述题目分析cpp代码 257. 二叉树的所有路径 题目描述 给你一个二叉树的根节点root &#xff0c;按任意顺序&#xff0c;返回所有从根节点到叶子节点的路径。 题目分析 其实从根节点往下走&#xff0c…

C语言/数据结构——(链表的回文结构)

一.前言 今天在牛客网上刷到了一道链表题——链表的回文结构https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?&#xff0c;巧合的是它的解题思路恰好是我们一起分享过两道链表题的汇总。这两道题分别是反转链表和链表的中间节点。废话不多数&#xff0c…

css 案例 横向滚动渐变

效果 完整代码&#xff1a; <template><view class"content"><view class"tab"><view class"tab-item" v-for"(item,index) in tab" :key"index" click"handlerTab(index)":class"ind…

Spring Cloud Gateway 11种断言工厂

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Spring Cloud Gateway路由匹配是Spring WebFlux基础功能的一部分,在Spri…