高效检查数组奇偶交替模式:JavaScript实现与解析

高效检查数组奇偶交替模式:JavaScript实现与解析

本文旨在提供一个高效且简洁的JavaScript解决方案,用于检查给定数组中的数字是否严格遵循奇偶交替模式。我们将探讨如何通过比较相邻元素的奇偶性来快速定位模式中断点,并提供详细的代码实现、示例分析以及注意事项,帮助开发者理解并应用这一逻辑。

问题描述

在处理数组数据时,有时需要验证其元素是否按照特定的模式排列。一个常见的模式是“奇偶交替”,即数组中的数字应严格遵循奇数-偶数-奇数…或偶数-奇数-偶数…的顺序。如果数组中存在任何数字打破了这种交替模式,我们需要返回该数字的索引;如果整个数组都符合模式,则返回 -1。数组中的所有数字均为正整数。

例如:

[1, 4, 5, 7, 4]:在索引 3 处,7 (奇数) 后面跟着 4 (偶数),但它前面是 5 (奇数)。模式是 奇-偶-奇-奇-偶,在索引 3 7(奇数)和 5(奇数)之间出现 奇-奇 模式中断。应返回 3。[25, 25, 25]:在索引 1 处,25 (奇数) 后面跟着 25 (奇数)。模式中断。应返回 1。[4, 5, 2, 7, 4, 9]:所有数字都严格交替 偶-奇-偶-奇-偶-奇。应返回 -1。

解决方案的核心思路

解决此类问题的关键在于简化判断逻辑。我们不需要预先判断数组是从奇数开始还是从偶数开始,也不需要将偶数索引和奇数索引的元素分开处理。一个更直接且高效的方法是:从第二个元素开始,将当前元素的奇偶性与其前一个元素的奇偶性进行比较。

如果当前元素的奇偶性与前一个元素的奇偶性相同,则意味着模式被打破,因为按照交替模式,它们的奇偶性应该不同。此时,我们立即返回当前元素的索引。如果遍历完整个数组都没有发现这种模式中断,则表示数组完全符合交替模式,返回 -1。

JavaScript 实现

基于上述核心思路,我们可以编写一个简洁高效的 JavaScript 函数:

立即学习“Java免费学习笔记(深入)”;

/** * 检查数组是否遵循奇偶交替模式。 * 如果发现模式中断,返回第一个中断点的索引。 * 如果整个数组都遵循模式,返回 -1。 * * @param {number[]} arr - 待检查的数字数组,所有数字均为正整数。 * @returns {number} - 模式中断的索引,或 -1。 */function checkAlternatingParity(arr) {  // 用于存储前一个元素的奇偶性。  // 注意:对于第一个元素,x将是undefined,第一次比较x === y会是false,  // 随后x会被正确初始化为第一个元素的奇偶性。  let previousParity;  for (let i = 0; i  0),    // 检查当前元素的奇偶性是否与前一个元素的奇偶性相同。    // 如果相同,则模式被打破。    if (i > 0 && previousParity === currentParity) {      return i; // 返回当前元素的索引    }    // 更新 previousParity 为当前元素的奇偶性,供下一个迭代使用。    previousParity = currentParity;  }  // 如果循环结束,表示没有发现模式中断,返回 -1。  return -1;}// 示例测试console.log(checkAlternatingParity([1, 4, 5, 7, 4]));     // 预期输出: 3console.log(checkAlternatingParity([25, 25, 25]));       // 预期输出: 1console.log(checkAlternatingParity([4, 5, 2, 7, 4, 9])); // 预期输出: -1console.log(checkAlternatingParity([]));                 // 预期输出: -1 (空数组视为符合模式)console.log(checkAlternatingParity([1]));                // 预期输出: -1 (单元素数组视为符合模式)

代码解析

previousParity 变量:

let previousParity;:这个变量用来存储前一个元素的奇偶性(0代表偶数,1代表奇数)。在循环开始时,previousParity是undefined。当i=0时,i > 0条件不满足,所以不会进行比较。previousParity随后会被赋值为arr[0] % 2。这种处理方式巧妙地避免了对第一个元素进行特殊判断。

循环遍历:

for (let i = 0; i

计算当前奇偶性:

const currentParity = arr[i] % 2;:使用模运算符 % 来获取当前数字的奇偶性。如果结果是 0,则为偶数;如果结果是 1,则为奇数。

模式检查:

if (i > 0 && previousParity === currentParity):这是核心判断逻辑。i > 0:确保我们从第二个元素开始进行比较,因为第一个元素没有“前一个”元素来比较。previousParity === currentParity:如果当前元素的奇偶性与前一个元素的奇偶性相同,这意味着模式被打破了(例如,奇数后面跟着奇数,或者偶数后面跟着偶数)。如果条件成立,return i; 立即返回当前元素的索引,表示这是第一个模式中断点。

更新 previousParity:

previousParity = currentParity;:在每次循环的最后,将当前元素的奇偶性保存到 previousParity 中,以便在下一个迭代中作为“前一个”元素的奇偶性进行比较。

无中断情况:

return -1;:如果循环顺利完成,没有触发任何 return i; 语句,则表示整个数组都遵循奇偶交替模式,此时返回 -1。

示例分析

让我们通过几个例子来深入理解 checkAlternatingParity 函数的运行过程。

示例 1: [1, 4, 5, 7, 4]

i arr[i] currentParity previousParity (循环开始时) i > 0 && previousParity === currentParity 返回值 previousParity (循环结束时)

011undefinedfalse-11401false (1 !== 0)-02510false (0 !== 1)-13711true (1 === 1)3-

在 i = 3 时,arr[3] 是 7,其奇偶性 currentParity 是 1。此时 previousParity 也是 1(来自 arr[2] 即 5)。由于 1 === 1,模式被打破,函数返回 3。

示例 2: [25, 25, 25]

i arr[i] currentParity previousParity (循环开始时) i > 0 && previousParity === currentParity 返回值 previousParity (循环结束时)

0251undefinedfalse-112511true (1 === 1)1-

在 i = 1 时,arr[1] 是 25,其奇偶性 currentParity 是 1。此时 previousParity 也是 1(来自 arr[0] 即 25)。由于 1 === 1,模式被打破,函数返回 1。

示例 3: [4, 5, 2, 7, 4, 9]

i arr[i] currentParity previousParity (循环开始时) i > 0 && previousParity === currentParity 返回值 previousParity (循环结束时)

040undefinedfalse-01510false (0 !== 1)-12201false (1 !== 0)-03710false (0 !== 1)-14401false (1 !== 0)-05910false (0 !== 1)-1

所有元素都遵循交替模式,循环结束,函数返回 -1。

注意事项与优化

时间复杂度: 该解决方案的时间复杂度为 O(n),其中 n 是数组的长度。因为我们只需要遍历数组一次。空间复杂度: 空间复杂度为 O(1),因为我们只使用了几个固定大小的变量。空数组和单元素数组:对于空数组 [],循环不会执行,函数直接返回 -1,这符合预期(空数组没有模式可打破)。对于单元素数组 [X],循环只执行一次(i=0),i > 0 条件不满足,previousParity 被赋值,然后循环结束。函数返回 -1,这也符合预期(单元素数组没有相邻元素来打破模式)。数据类型: 题目明确指出所有数字都是正整数。如果数组可能包含负数、零或非整数,则需要调整奇偶性判断逻辑(例如,Math.abs(num) % 2 或更复杂的类型检查)。模运算符的性质: num % 2 对于正整数能正确返回 0 或 1。

总结

通过比较相邻元素的奇偶性,我们能够以线性时间复杂度 O(n) 和常数空间复杂度 O(1) 高效地检查数组是否遵循奇偶交替模式。这种方法不仅代码简洁,而且逻辑清晰,能够准确地定位第一个模式中断点,并优雅地处理各种边界情况,是解决此类问题的理想方案。

以上就是高效检查数组奇偶交替模式:JavaScript实现与解析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1517371.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用 JavaScript 构建扫雷游戏:一步步教程
上一篇 2025年12月20日 10:43:12
JavaScript控制台扫雷游戏开发教程
下一篇 2025年12月20日 10:43:17

相关推荐

  • 抖音飞鸽客服名称怎么改?抖店客服名称怎么改

    电商行业在我国经济中的地位日益凸显。为了满足消费者日益增长的服务需求,各大电商平台纷纷推出特色客服服务。抖音飞鸽客服作为抖音平台的官方客服,以其独特的服务模式和创新精神,赢得了广大用户的认可和好评。本文将从抖音飞鸽客服的名称改写、服务特色、行业影响等方面进行分析,以期为电商客服行业的发展提供借鉴。 …

    2026年9月22日
    000
  • mysql如何添加主键索引 mysql创建主键索引的步骤详解

    mysql如何添加主键索引 mysql创建主键索引的步骤详解mysql如何添加主键索引 mysql创建主键索引的步骤详解mysql如何添加主键索引 mysql创建主键索引的步骤详解mysql如何添加主键索引 mysql创建主键索引的步骤详解

    mysql中添加主键索引主要有三种方式:1. 创建新表时直接添加主键,可在列定义后使用primary key或在所有列定义后单独声明;2. 在已有表上通过alter table添加主键,需确保目标列非空且唯一,必要时先清洗数据;3. 添加复合主键,适用于多列组合才能唯一标识记录的情况。主键索引在in…

    2026年9月22日 用户投稿
    000
  • Java中递归处理列表:排序验证与条件性最大值移除策略

    在处理列表数据时,我们常遇到需要根据特定条件修改列表的需求。本教程将深入探讨一个具体的场景:如何设计一个递归函数,该函数首先判断一个整数列表是否已按升序排序。如果列表已排序,则停止处理;如果未排序,则进一步检查列表中的最大值。仅当最大值位于列表的起始位置或末尾时,才将其移除,并对修改后的列表重复此过…

    2026年9月22日
    000
  • iPhone 17邀请函暗藏玄机 博主:散热稳了

    8月27日消息,苹果新品发布会已确定于北京时间9月10日凌晨1点举行,有网友指出,苹果发布的宣传海报中,其logo呈现出类似热成像图的视觉效果,疑似暗示iphone 17系列将在散热方面迎来重大升级。 科技博主定焦数码分析称,发布会海报中橘红色的高温区域正逐步消散,这一视觉设计意在突出iPhone …

    2026年9月22日
    200
  • 苹果手机锁屏信息如何设置在中间

    一、系统版本前提 想要调整苹果手机锁屏信息的显示位置,首先需要确认设备运行的是较新版本的 iOS 系统。通常情况下,iOS 的高版本系统会提供更丰富的自定义功能,为实现锁屏内容居中显示打下基础。 二、基础设置路径 进入手机主界面,打开“设置”应用。在设置列表中找到“显示与亮度”并点击进入。此页面包含…

    2026年9月22日
    700
  • ClipStudioPaintPro如何导出AI漫画图片?保存图像的详细指南

    导出AI漫画图片需通过Clip Studio Paint Pro的“文件”菜单选择“导出”,根据用途选单页、多页或Webtoon导出,推荐PNG用于高质量或透明背景需求,JPG用于网络分享以平衡文件大小与画质,设置300dpi以上分辨率确保清晰度,色彩配置选用sRGB保障跨平台一致性,批量导出时利用…

    2026年9月22日
    200
  • iPhone如何实现一键迁移数据

    一键换机:告别复杂步骤 当你拿到一台全新的iPhone,面对旧设备里的海量数据,是否曾感到无从下手?过去,迁移数据常常需要连接电脑、使用数据线,甚至依赖第三方工具,流程繁琐又费时。如今,iPhone提供了一键迁移功能,让整个过程变得异常简单。只需几个步骤,你的照片、视频、通讯录、短信记录以及各类应用…

    2026年9月22日
    300
  • 谷歌浏览器官网直接进入 Chrome浏览器官方登录入口

    谷歌浏览器官网直接进入方式为访问https://www.google.com/chrome/,该网站是Chrome官方登录入口,提供跨平台同步、V8引擎加速、地址栏集成搜索、自动填充表单等核心功能,支持极简界面、深色模式、自定义新标签页及侧边栏服务,具备安全浏览、隐私沙盒、密码检查和无痕模式等安全机…

    2026年9月22日
    200
  • windows8桌面图标有蓝色阴影怎么去掉_windows8取消桌面图标蓝色底纹的方法

    1、调整视觉效果设置,取消“在桌面上为图标标签使用阴影”可消除蓝色背景;2、解除桌面Web项目锁定并清除Web内容;3、专业版用户可通过组策略禁用Active Desktop功能以彻底解决问题。 如果您发现Windows 8系统中的桌面图标带有蓝色阴影或底纹,这通常是由于系统视觉效果设置或桌面项目锁…

    2026年9月22日
    200
  • 如何用AdobePremierePro制作AI视频?快速上手AI视频剪辑的完整教程

    如何用AdobePremierePro制作AI视频?快速上手AI视频剪辑的完整教程如何用AdobePremierePro制作AI视频?快速上手AI视频剪辑的完整教程如何用AdobePremierePro制作AI视频?快速上手AI视频剪辑的完整教程如何用AdobePremierePro制作AI视频?快速上手AI视频剪辑的完整教程

    答案:在Premiere Pro中制作AI视频需整合第三方AI工具生成的素材并进行精细化剪辑。首先明确主题,利用Midjourney、RunwayML、ElevenLabs等工具生成图像、视频和音频;随后导入PR并分类组织,通过粗剪与同步构建叙事框架;接着运用Lumetri Color统一色调,基本…

    2026年9月22日 用户投稿
    1200
  • 递归实现列表排序检查与条件移除最大值

    本文详细介绍了如何使用Java递归方法处理整数列表。核心内容包括:首先检查列表是否已排序,如果已排序则直接返回false;如果未排序,则查找列表中的最大值。仅当最大值位于列表的起始或结束位置时,才将其移除并递归地继续处理列表。如果最大值位于列表中间,则打印当前列表并终止递归。 在数据处理和算法设计中…

    2026年9月22日
    100
  • 石墨文档如何创建在线表格并排序_石墨文档表格处理的高效技巧

    首先创建在线表格并进行排序,提升团队协作效率。打开石墨文档点击“新建”选择“表格”,支持从Excel导入数据、多页管理及多人协同编辑;选中数据区域后通过“数据”菜单进行单列或多条件排序,注意避免合并单元格影响范围,配合筛选功能更高效;利用快捷键跳转、自动调整列宽、冻结行列、使用模板、设置格式、添加评…

    2026年9月22日
    200
  • OPPO Find X9系列前瞻:外观大变 全面升级无短板

    知名数码博主“数码闲聊站”近日透露了oppo find x9的外观设计,引发广泛关注。与前代产品采用的居中圆形镜头模组不同,find x9改用左上角垂直排列的方形矩阵摄像头,整体背部布局更显规整,视觉风格焕然一新,同时提升了握持手感,展现出oppo对用户反馈的高度重视。不过随后该博主迅速撤回相关微博…

    2026年9月22日
    000
  • 如何用Sublime导出MySQL数据表结构_生成Markdown或HTML格式文档

    要使用 sublime text 导出 mysql 数据表结构并生成 markdown 或 html 文档,需通过以下步骤操作:1. 使用 show create table 命令或 mysqldump 工具获取建表语句;2. 在 sublime 中整理字段信息,按字段名、类型、是否为空、键、默认值…

    2026年9月22日
    100
  • Java Collections.sort与Collections.reverse的使用区别

    Collections.sort用于排序,基于元素值比较,结果有序,默认升序,可自定义规则;2. Collections.reverse仅反转列表顺序,不比较元素,时间复杂度O(n);3. 两者功能不同,不可替代,按需选择使用。 Java 中 Collections.sort 和 Collectio…

    2026年9月21日
    300
  • safari浏览器怎么把标签页固定在最左边_safari浏览器标签页固定最左设置

    Safari可通过“固定标签”功能将常用网页保持在标签栏最左并随启动恢复;2. 手动拖动标签至最左可临时调整顺序但不永久保存;3. 结合书签栏添加常用网站并固定标签,可提升访问效率。 如果您希望在使用 Safari 浏览器时将常用网页始终保持在标签栏的最左侧位置,以便快速访问,可以通过以下方法实现标…

    2026年9月21日
    100
  • PHP/MySQL:高效合并订单商品并按日期分组显示

    本教程将指导如何在PHP/MySQL应用中,将同一日期的订单商品合并显示在同一行,以提高数据展示的清晰度。核心解决方案是利用MySQL的GROUP_CONCAT函数在数据库层面进行高效聚合,避免复杂的PHP逻辑处理,从而简化代码并优化性能。 订单数据展示的常见挑战 在开发在线购物平台时,通常需要向用…

    2026年9月21日
    200
  • 俄罗斯Яндекс账号登录入口 Yandex电脑版官方网站登录

    答案是https://www.yandex.com/。该网站提供搜索、地图、新闻、翻译等服务,界面简洁,支持个性化设置与账户同步,并拥有邮箱、云存储及丰富的应用生态。 1、立即进入“☞☞☞☞点击俄罗斯yandex搜索引擎入口☜☜☜☜”; 2、立即进入“☞☞☞☞点击快速获取Yandex免登录官网链接☜…

    2026年9月21日
    000
  • 谷歌浏览器官方主站入口 最新Chrome在线登录页面

    谷歌浏览器官方主站入口是https://www.google.com,该页面具备界面简洁、操作流畅、集成化服务入口和个性化推荐等特点,支持多设备访问且无广告干扰。 谷歌浏览器官方主站入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来谷歌浏览器最新Chrome在线登录页面相关信息,感兴趣的…

    2026年9月21日
    100
  • 鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览

    鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览

    在《鸣潮》2.7版本中,每位角色都设有专属的隐藏成就与趣味彩蛋。其中,嘉贝莉娜相关的隐藏成就“再会,清醒的猎人”需要玩家满足特定的时间与地点条件方可触发。以下是该成就的详细达成方法汇总。 鸣潮2.7嘉贝莉娜隐藏成就触发条件全解析——地点一: 1、传送到黎那汐塔区域的【烈日酒馆】。 2、进入酒馆后,朝…

    2026年9月21日 用户投稿
    000

发表回复

登录后才能评论
关注微信