JS数组解构赋值变量存在依赖关系

news2024/9/22 4:14:47

题目随便起的,
在刷力扣 41.缺失的第一个正数 这个题的时候,出现了解构赋值的问题,
对于[a,b] = [1,2]和[b,a]=[2,1]按理说都是行的通的,和位置没有关系,本质上都是进行交换

可是当我在题目中
使用[nums[nums[i]-1], nums[i]] = [nums[i], nums[nums[i]-1]]时是可以通过测试用例的,
使用[nums[i], nums[nums[i]-1]] = [nums[nums[i]-1], nums[i]]会超时

41. 缺失的第一个正数

题目要求返回缺失的第一个正整数,那么我们可以采用“一个萝卜一个坑”的思想
将数组中的所有数字归位,当下标为[0,N]时,数字应该为[1,N+1]
那么数值为i的数应该放在下标为i-1的位置
比如数字:nums[i],它的下标应该为nums[i]-1
所以,反过来说,下标为nums[i]-1的地方对应的数字应该为nums[nums[i]-1]
通过上面的推导,我们可以得出一个结论:nums[nums[i]-1] === nums[i]
于是,我们可以遍历一遍,将所有的数组交换到正确的位置,然后再进行一次遍历,找到nums[i] != i + 1的数

var firstMissingPositive = function(nums) {
    for(let i = 0; i < nums.length; i++){
        while(nums[i] > 0 && nums[i] <= nums.length && nums[nums[i]-1] != nums[i] ){
            // ok
            const temp = nums[nums[i]-1]; 
            nums[nums[i]-1] = nums[i];
            nums[i] = temp;

            // const temp = nums[i];
            // nums[i] = nums[nums[i]-1];
            // nums[nums[i]-1] = temp;

            // [nums[i], nums[nums[i]-1]] = [nums[nums[i]-1], nums[i]]
            // [nums[nums[i]-1], nums[i]] = [nums[i], nums[nums[i]-1]] ok
        }
    }
    for(let i = 0; i < nums.length; i++){
        if(nums[i] != i+1){
            return i+1;
        }
    }
    return nums.length + 1;
};

但是,[nums[i], nums[nums[i]-1]] = [nums[nums[i]-1], nums[i]]这样写是错的

解释

首先,清楚
情况一:

const temp = nums[nums[i]-1]; 
nums[nums[i]-1] = nums[i];
nums[i] = temp;

// 等价于 

[nums[nums[i]-1], nums[i]] = [nums[i], nums[nums[i]-1]]

情况二:

const temp = nums[i];
nums[i] = nums[nums[i]-1];
nums[nums[i]-1] = temp;

// 等价于

[nums[i], nums[nums[i]-1]] = [nums[nums[i]-1], nums[i]]

情况一:
对于情况一,
我们先暂存了 nums[nums[i]-1]地址的值,然后更新nums[nums[i]-1]地址的值,
因为此时nums[i]的值没有变,所以 nums[nums[i]-1]所指向的地址没有变,我们只是改变了该地址对应的值,
最后更新nums[i]的值

情况二:
我们先暂存了nums[i]的值,然后更新nums[i]地址的值,当走到第三步更新nums[nums[i]-1]地址的值时,因为nums[i]的值发生了变化,那么相当于nums[nums[i]-1]这个地址发生了变化,最后我们将一个新地址的原有值改变了
而我们的初衷是交换nums[nums[i]-1]nums[i]这两个地址的值,结果我们改变了一个新地址的值

画图模拟:

在这里插入图片描述

解决:

如果想让 [nums[i], nums[nums[i]-1]] = [nums[nums[i]-1], nums[i]]正确表示,
可以这样:

const tmp = nums[i];
nums[i] = nums[nums[i] - 1];
nums[tmp -1] = tmp;

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

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

相关文章

SpringMVC的高频面试题

2023最新版&#xff08;持续更新&#xff09; 一、SpringMVC的高频面试题1. SpringMVC的执行流程2. SpringMVC常见的注解有哪些&#xff1f; 一、SpringMVC的高频面试题 1. SpringMVC的执行流程 前置知识 视图阶段&#xff08;JSP&#xff09;: 涉及到的重要组件&#xff1a;…

KubeSphere 社区双周报 | KubeSphere 多项更新 | 2023.06.23-07.06

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.06.23-2023.…

管道设计专业版:Pipedata-Pro Crack

Pipedata-Pro 提高了管道设计的效率并减轻了查找管道信息的负担。它可以直观、轻松地检索最新的管道和设计数据。尺寸和重量单位可以设置为公制或美制单位。 Pipedata-Pro 于 1996 年由 Zeataline Projects 推出&#xff0c;现已遍布全球&#xff0c;Pipedata-Pro 管道表的映射…

怎么判断两个文档节点时候相同?判断两个DOM节点时候相等、相同的4种方法

方法1&#xff1a; document.querySelector(html) document.querySelector(html) //true 方法2&#xff1a;compareDocumentPosition document.querySelector(html).compareDocumentPosition(document.querySelector(html)) //0 返回0就代表相同 方法3&#xff1a;isEqualNode …

编译运行ContactDiscoveryService-Icelake

下载 git clone https://codeup.aliyun.com/6306306f95064d67d44656e5/lxr1907/ContactDiscoveryService-Icelake.git或github地址 git clone https://github.com/signalapp/ContactDiscoveryService-Icelake按照Readme安装 Building git submodule init git submodule update …

每次装完 homebrew,ohmyzsh 就会报错:Insecure completion-dependent directories detected:

参考:https://zhuanlan.zhihu.com/p/313037188 这是因为在big sur安装homebrew后&#xff0c;会在/usr/local/share/生成一个zsh文件夹&#xff0c;里面包含了 因此&#xff0c;zsh文件默认设置的权限是775&#xff0c;也就是group user有writer的权利&#xff0c;zsh认为这是…

python读写excel利器:xlwings从入门到精通

python读写excel利器&#xff1a;xlwings 从入门到精通 目录 安装和使用 基础操作 操作工作簿操作工作表读取单元格写入(单元格赋值)range的操作&#xff08;range常用的api&#xff09; 写入一行或一列Excel数据(函数式&#xff09;使用range(\A1\).api.AddComment(\comments…

本质矩阵(Essential Matrix)E进行分解的过程

分解本质矩阵的过程遵循以下步骤&#xff1a; 使用奇异值分解&#xff08;SVD&#xff09;计算本质矩阵E的分解。SVD分解是一种将矩阵分解为三个矩阵的乘积的方法&#xff0c;它的形式为 E UΣV^T&#xff0c;其中U和V是正交矩阵&#xff0c;Σ是对角矩阵。此步骤的结果存储在…

Edge浏览器无法展示Stable Diffusion Control Net插件

Edge浏览器无法展示Stable Diffusion Control Net插件 最近在学习Stable Diffusion&#xff0c;需要使用到Control Net插件&#xff0c;结果通过各种方式安装成功插件后&#xff0c;浏览器页面没有展示ControlNet相关页面&#xff0c;最终换到Chorme浏览器后正常&#xff0c;猜…

【Python】绘图_pandas(1)

# -*- coding: utf-8 -*- #汉字处理 import matplotlib.pyplot as plt import numpy as np from numpy.random import randn import pandas as pd #import DataFrame from matplotlib.font_manager import FontPropertiesfont FontProperties(fnamer"c:\windows\fonts\si…

基于51单片机的电子密码锁设计

功能&#xff1a;本实例是基于51单片机的电子密码锁&#xff0c;主要硬件由51单片机最小系统&#xff0c;LCD1602液晶屏电路&#xff0c;继电器控制电路&#xff0c;AT24C02存储电路&#xff0c;LED指示灯电路&#xff0c;矩阵按键电路构成。 1.系统采用LCD1602液晶屏作为显示屏…

【软件设计原则】系统设计面试基础:CAP 与 PACELC

什么是 CAP 定理以及 PACELC 如何扩展它&#xff1f; 在分布式系统中&#xff0c;可能会发生不同类型的故障&#xff0c;例如&#xff0c;服务器可能会崩溃或永久故障&#xff0c;磁盘可能会损坏导致数据丢失&#xff0c;或者网络连接可能会丢失&#xff0c;导致系统的一部分无…

在openFoam中创建cellZone

简介 openFoam的cellZone概念十分重要&#xff0c;可以给一个区域的单元命名&#xff0c;广泛应用于设置初始场&#xff08;如气、液两相流的初始VOF分布&#xff09; 而cellZone通常由cellSet转化而来&#xff0c;本文将介绍使用cellSet定义cellZone的方法 方法 在项目的sy…

【JavaWeb】博客系统的前端页面设计

目录 前言 1、页面组成 2、实现博客列表页 &#x1f342;设置背景图片 &#x1f342;设置导航栏 &#x1f342;实现版心 &#x1f343;实现个人信息 &#x1f343;实现博客列表 3、实现博客详情页 4、编写博客的登录页 5、博客编辑页面 &#x1f342;实现标题的编辑区 …

Python学习笔记-基于socket基础的http服务端程序

通过HTTP协议可以进行通信可以规范化的进行网络间通信。下面技术第一个http服务器小程序。简单的记录第一个试手程序。 1.http通信的基本流程 整个流程对应四层网络架构&#xff1a;应用层、传输层、网络层、链路层。有的部分已经封装&#xff0c;不需要我们再行处理。 2.服务…

哈夫曼树-算法

一、霍夫曼树基本概念&#xff1a; 路径&#xff1a;从树的一个结点到另外一个结点的分支构成这两个结点的路径 结点的长度&#xff1a;两节点之间路径的分支数 树的路径长度&#xff1a;从树根到每一个结点的长度之和&#xff0c;记做TL: 结点数目相同的二叉树中&#xff0…

LwIP系列(5):TCP 3次握手+4次挥手+状态机转换

前言 TCP的3次握手、4次挥手以及TCP状态机&#xff0c;是TCP的核心概念&#xff0c;我们在分析LwIp中TCP相关代码流程&#xff0c;也需要熟悉这些流程&#xff0c;本文就详细介绍这些概念。 TCP 3次握手、应用数据交互、4次挥手完整流程 TCP 为什么是3次握手&#xff0c;而不…

51单片机--动态数码管显示

文章目录 LED数码管一位晶体管多位一体数码管单片机上的数码管原理 静态数码管显示动态数码管显示 LED数码管 简介&#xff1a;LED数码管是一种常用的数字显示设备。它由多个发光二极&#xff08;LED&#xff09;封装在一起&#xff0c;形成“8”字型的器件。数码管通常由7段LE…

【从0开始离线数仓项目】——新能源汽车数仓项目介绍

目录 1、数据仓库概念 2、项目需求及架构设计 3、集群资源规划设计 4、车辆日志字段说明 1、数据仓库概念 数据仓库&#xff08;Data Warehouse&#xff09;是为企业提供数据支持&#xff0c;用以协助企业制定决策、改进业务流程和提高产品质量等方面的工具。它可以接收多种…

时间序列预测 | Matlab自回归差分移动平均模型ARIMA时间序列预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测 | Matlab自回归差分移动平均模型ARIMA时间序列预测,单列数据输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变量 warnin…