缺失数字,给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

题记:

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

示例 1:

输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2是丢失的数字,因为它没有出现在 nums 中。

示例 2:

输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2是丢失的数字,因为它没有出现在 nums 中。

示例 3:

输入:nums = [9,6,4,2,3,5,7,0,1]
输出:8
解释:n = 9,因为有 9 个数字,所以所有的数字都在范围[0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

示例 4:

输入:nums = [0]
输出:1
解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1是丢失的数字,因为它没有出现在 nums 中。

提示:

  • n == nums.length
  • 1 <= n <= 10 ^ 4
  • 0 <= nums[i] <= n
  • nums 中的所有数字都 独一无二

**进阶:**你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?

题目来源:
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnj4mt/
来源:力扣(LeetCode)

解题方法

自己想的:

补全数组,再比较差集即可

代码为:

/*** @param Integer[] $nums* @return Integer*/
function missingNumber($nums) {$length = count($nums);$nums_array = [];//补全数组,再比较差集即可for($i = 0; $i <= $length; $i++){array_push($nums_array, $i);}$res = array_diff($nums_array, $nums);return current($res);
}

其他方法:

官方PHP代码:

/*** @param Integer[] $nums* @return Integer*/
function missingNumber($nums) {//从0开始填充n(nums的长度+1)个1,[3,0,1]为例$result = array_fill(0, count($nums)+1, 1); //[1,1,1,1]foreach($nums as $num) {$result[$num]--;    //[0,0,1,0]}//result的那个值大于0,对应的键值就位确实的数字foreach($result as $k => $v) {if($v > 0) {return $k;  //2}}
}

位运算求解

题中的意思就是从数字[0,n]之间的n+1个数字少了一个,而其他的数字都存在。

如果我们把这个数组添加从0~n的n+1个元素,就变成了数组中只有一个数出现了一次,其他数字都出现了2次,让我们求这个只出现一次的数字。这题使用位运算是最容易解决的,关于位运算有下面几个规律

1^1=0;

1^0=1;

0^1=1;

0^0=0;

也就说0和1异或的时候相同的异或结果为0,不同的异或结果为1,根据上面的规律我们得到

a^a=0;自己和自己异或等于0

a^0=a;任何数字和0异或还等于他自己

a ^ b ^ c=a ^ c^ b;异或运算具有交换律

有了这3个规律,这题就很容易解了,我们只需要把所有的数字都异或一遍,最终的结果就是我们要求的那个数字。来看下代码

public int missingNumber(int[] nums) {int xor = 0;for (int i = 0; i < nums.length; i++)xor ^= nums[i] ^ (i + 1);return xor;
}

转换为PHP代码

/*** @param Integer[] $nums* @return Integer*/
function missingNumber($nums) {//位运算$xor = 0;                               //[3,0,1]for($i = 0; $i < count($nums); $i++){   // i=0;  nums[0] = 3; (0 + 1) = 1$xor ^= $nums[$i] ^ ($i + 1);       // xor =0 ^ 3 ^ 1   == 2}                                       // i=1;  nums[1] = 0; (1 + 1) = 2return $xor;                            // xor =2 ^ 0 ^ 2   == 0// i=2;  nums[2] = 1; (2 + 1) = 3// xor =0 ^ 1 ^ 3   == 2
}

求和

如果不缺那个数字的话,这个数组的所有数字可以组成一个等差数列,我们只需要根据公式求和,然后再减去数组中所有的数字即可,代码如下

public int missingNumber(int[] nums) {int length = nums.length;int sum = (0 + length) * (length + 1) / 2;for (int i = 0; i < length; i++)sum -= nums[i];return sum;
}

转换为PHP代码为:

/*** @param Integer[] $nums* @return Integer*/
function missingNumber($nums) {//求和$length = count($nums);$sum = (0 + $length) * ($length + 1) / 2;   //等差数列求和公式为   (首项+末项)*项数 / 2for($i = 0; $i < $length; $i++){            //[3,0,1]  [0,1,2,3]  (0 + 3)*4 / 2$sum -= $nums[$i];                      //挨个减3,0,1,得到的结果为缺失的数字}return $sum;
}

方法来源:
作者:数据结构和算法
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnj4mt/?discussion=wMwk77
来源:力扣(LeetCode)

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

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

相关文章

ChatGPT辅助写论文:提升效率与创造力的利器

写作是人类最重要的交流方式之一&#xff0c;也是学术研究中不可或缺的环节。然而&#xff0c;写作并不是一件容易的事情&#xff0c;尤其是对于科研人员来说&#xff0c;他们需要花费大量的时间和精力来撰写高质量的论文&#xff0c;并且面临着各种各样的挑战&#xff0c;如语…

【Spring Boot】请求参数传json对象,后端采用(map)CRUD案例(101)

请求参数传json对象&#xff0c;后端采用&#xff08;map&#xff09;接收的前提条件&#xff1a; 1.Spring Boot 的Controller接受参数采用&#xff1a;RequestBody 2.需要一个Json工具类&#xff0c;将json数据转成Map&#xff1b; 工具类&#xff1a;Json转Map import com…

一文了解JavaScript 与 TypeScript的区别

TypeScript 和 JavaScript 是两种互补的技术&#xff0c;共同推动前端和后端开发。在本文中&#xff0c;我们将带您快速了解JavaScript 与 TypeScript的区别。 一、TypeScript 和 JavaScript 之间的区别 JavaScript 和 TypeScript 看起来非常相似&#xff0c;但有一个重要的区…

mac前端代码编辑 Sublime Text 4 Dev 中文v4.0(4151)

Sublime Text 4 for Mac是一款功能强大的代码编辑器&#xff0c;适合所有需要高效编写代码和进行代码管理的程序员使用。 快速响应&#xff1a;Sublime Text 4在加载文件和执行命令时非常快速&#xff0c;能够让用户在高效的开发过程中体验到无缝的交互。 多种语言支持&#…

c语言函数类型强转语法

在 C 语言中&#xff0c;可以通过函数类型强制转换&#xff08;也称为函数指针类型强制转换&#xff09;将一个函数的类型转换为另一个函数类型。 函数类型强转语法如下&#xff1a; c (return_type (*function_ptr)(arg_type1, arg_type2, ..., arg_typeN)) (arg_type1, arg…

express学习笔记4 - 热更新以及express-boom

我们每次改动代码的时候都要重启项目&#xff0c;现在我们给项目添加一个热更新 npm install --save-dev nodemon # or using yarn: yarn add nodemon -D 在package.json添加一行代码 "dev": "nodemon ./bin/www" 重启项目 然后随便做改动&#xff…

uniapp微信小程序下载文件并打开

uni.downloadFile({url: 下载的地址,success(res) {console.log(res)if (res.statusCode 200) {console.log(下载成功);var filePath encodeURI(res.tempFilePath);uni.openDocument({filePath: filePath,fileType: "xlsx",showMenu: true,success: function(res) …

守护?全局解释器锁?Python那些若隐若现的进程线程知识-开发技巧IX

篇主在web开发中其实用得不多。在当下云平台盛行&#xff0c;依靠平台能力&#xff0c;CI/CD式做法开多个worker工作进程完事&#xff0c;除一些监控日志插件会用多线程多进程&#xff0c;web开发是比较少用的。 先讲一个python开发都听过的&#xff1a;GIL&#xff0c;即全局解…

【话题】感觉和身边其他人有差距怎么办?也许自我调整很重要

每个人能力有限&#xff0c;水平高低不同&#xff0c;我们身在大环境里&#xff0c;虽然在同一个起跑线上&#xff0c;但是时间久了&#xff0c;你会发现&#xff0c;并越来越感觉到和身边其他人有了差距&#xff0c;慢慢的会有一定的落差感&#xff0c;怎么办呢&#xff01;通…

80. 删除有序数组中的重复项 II (力扣刷题)

删除有序数组中的重复项 II 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空…

java读写properties文件和xml文件,解决中文乱码问题

文章目录 前言一、properties文件1.1properties格式介绍1.2读取项目resource/templates下面properties并处理中文乱码问题1.3读取本地properties并处理中文乱码问题1.4修改properties文件 二、XML文件2.1xml文件格式2.2读取xml文件2.3写xml文件 前言 在开发当中我们经常需要用…

MySQL数据库——多表操作

文章目录 前言多表关系一对一关系一对多/多对一关系多对多关系 外键约束创建外键约束插入数据删除带有外键约束的表的数据删除外键约束 多表联合查询数据准备交叉连接查询内连接查询外连接查询左外连接查询右外连接查询满外连接查询 子查询子查询关键字ALL 关键字ANY 和 SOME 关…

Java中各种数据类型占字节数

Java数据类型占用字节数简介 Java是广泛应用于大型企业系统的一种面向对象编程语言&#xff0c;它被广泛应用于多种物联网应用、移动应用开发&#xff0c;以及网站后台的开发中。在Java语言中&#xff0c;数据类型对于变量的定义起到了至关重要的作用&#xff0c;这些数据类型…

Nacos 抽取公共配置

文章目录 创建一个公共配置文件其他配置文件引用springboot配置文件 创建一个公共配置文件 其他配置文件引用 ${变量} springboot配置文件 spring:cloud:nacos:discovery:server-addr: current.ip:8848namespace: word_register_proconfig:server-addr: current.ip:8848auto-r…

大模型时代下,算法工程师该何去何从?

目录 一、大模型时代的罪与罚1.1、快速演进的大模型技术1.2、模型表现出的惊人创造力1.3、大模型AI对算法工程师的威胁性 二、算法工程师的破与发2.1、破——大模型时代给算法工程师带来的新机遇2.2、发——算法工程师如何适应大模型时代的变革 三、大模型时代下人才发展洞察 大…

spring.config.location 手动指定配置文件文件

–spring.config.locationD:\javaproject\bangsun\ds-admin\ds-oper-mgr\src\main\resources\application.yml

IOCP简单了解

1.IOCP是什么 IOCP是Input/Output Completion Ports的简称&#xff0c;中文翻译为完成端口&#xff0c;完成是应用程序向系统发起一个IO操作&#xff0c;系统会在操作结束后&#xff0c;将IO操作完成结果通知应用程序&#xff0c;端口指的是机制 2.重叠IO&#xff08;Overlappe…

代码调试2:coco数据集生成深度图

代码调试:coco数据集生成深度图 作者:安静到无声 个人主页 问题1:图片存在异常,跳过不处理 在获取深度图的时候,直接执代码,会产生以下错误:RuntimeError和ValueError。 因此我重新修改了代码,如果出现以下两种错误,则执行下一次循环,代码如下: 修改之后代码可以…

iceberg对比hive优势

1.事务性 从事务性上来说&#xff0c;iceberg具有更高的数据质量。 因为iceberg本质是一种table format&#xff0c;屏蔽了底层的存储细节&#xff0c;写入数据时候需要严格按照schema写入。而hive可以先写入底层数据&#xff0c;然后使用load partition的方式来加载分区。这样…

二叉树的相关题目

目录 1、根据二叉树创建字符串 2、二叉树的层序遍历 3、二叉树的最近公共祖先 4、搜索二叉树与双向链表 5、从前序与中序遍历序列构造二叉树 6、 从中序与后序遍历序列构造二叉树 7、二叉树的前序遍历&#xff08;非递归实现&#xff09; 8、二叉树的中序遍历&#xff08…