Go语言题解LeetCode268丢失的数字示例详解
作者:刘09k11 发布时间:2024-05-02 16:24:29
题目描述
原题链接 :
268. 丢失的数字
给定一个包含 [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 中的所有数字都 独一无二
进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?
思路分析
拿到这个题目,发现其是在[0,n]范围内给出n个数字,也就是说,这个是高度适配将数组进行排序的想法的。 对于完整的数组,其排序后应该是一个跟下标值完全一致的数组集合。 那么解法就很简单了,寻找第一个跟元素不匹配的下标,其就是缺失的数字;
AC 代码
class Solution:
def missingNumber(self, nums: List[int]) -> int:
nums.sort()
for i in range(len(nums)):
if nums[i] != i:
return i
return len(nums)
异或两遍 - 丢失的数字
解题思路
异或是一个可交换顺序的操作。同一个数字异或两遍等于零。
所以我们先求出数据的范围,直接找最大的数即可。 这里需要注意,如果最大的数字小于数组长度,则缺失的数字是最大的数字+1。
然后我们对 [0, n] 的所有数字累计异或一边,再对数组中的所有元素也异或一遍,最后就只剩下唯一一个没有出现的数字了。因为其他数字都出现了两遍。
代码
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = 0;
int ans = 0;
for (auto num: nums) {
n = max(n, num);
ans ^= num;
}
if (nums.size() > n) n = nums.size();
for (int i = 0; i <= n; i++) {
ans ^= i;
}
return ans;
}
};
C++ 排序二分、加减法、异或 - 丢失的数字
解题思路:
看到该题第一个想法就是二分法,首先给数字排序,然后通过mid值判断在左边还是在右边,nums[mid] == mid说明在右边,否则在左边,但是最后还要注意缺失的是最后一个数的情况,那么我们就要根据最后一个数进行判断,再进行返回,代码如下:
class Solution {
public:
int missingNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int left = 0, right = nums.size() - 1;
while(left < right) {
int mid = (left + right) / 2;
if(nums[mid] == mid) {
left = mid + 1;
} else {
right = mid;
}
}
return (right == nums.size() - 1 && nums[right] == right) ? right + 1 : right;
}
};
但是显然没必要那么复杂,时间效率低,最全局的想法就是把所有下标加起来并且把数组都减去,剩下的就是丢失的数字,代码如下:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int total = 0;
int i;
for(i = 0; i < nums.size(); i ++) {
total += i;
total -= nums[i];
}
total += i;
return total;
}
};
异或的方法其实和加减方法实现方式一样,只是底层原理不同罢了,思路都是抵消掉相同的,留下唯一一个单独的,代码如下:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int total = 0;
int i;
for(i = 0; i < nums.size(); i ++) {
total ^= i;
total ^= nums[i];
}
total ^= i;
return total;
}
};
来源:https://juejin.cn/post/7174347017261432840


猜你喜欢
- 一维插值插值不同于拟合。插值函数经过样本点,拟合函数一般基于最小二乘法尽量靠近所有样本点穿过。常见插值方法有拉格朗日插值法、分段插值法、样条
- 安装了pycharm之后有一个新装的python解释器,顶替了之前系统的python那样的话,原来利用pip安装的一些库会无法import.
- 数据库基本操作在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。会话用db.session表示。在准备把数据写
- 简介:单例模式可以保证一个类仅有一个实例,并提供一个访问它的全局访问点。适用性于当类只能有一个实例而且客户可以从一个众所周知的访问点访问它,
- 修复Access数据库,我们一般使用微软Office 97中带的Access 97对数据库进行修复和整理。Access数据库被损坏分以下几种
- 一、获取安装包:Pycharm 官网 下载页面 :点击打开Anconda 官网 下载页面 :点击打开选择对应的系统和需要的版本进行下载,py
- 很多人觉得程序猿是高薪的代表,很多人都想学习一门编程语言,如果你想选择一种语言来入门编程,那么Python绝对是首选!其非常接近自然语言,精
- 题目描述997. 找到小镇的法官 - 力扣(LeetCode)小镇里有 n 个人,按从 1 到 n 的顺序编号。传言称,这些人中有一个暗地里
- 一.Sobel算子Sobel算子是一种用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导。该算子用于计算图像明暗程度近似值,根据图像边缘
- 合成微缩效果前言图像中的模糊效果可以强烈影响被拍摄场景的感知,模糊在传达所需的尺寸和距离感方面起着重要作用。合成微缩 (miniature
- 导出到excel EXEC master..xp_cmdshell 'bcp Settle
- 一、VScode下载官网Download Visual Studio Code - Mac, Linux, Windows点击64 bit会
- 快速修改mysql密码的四种方法方法1: 用SET PASSWORD命令 首先登录MySQL。 格式:mysql>
- 一、使用loadVariables 一个例子简单的描述了如何通过GET方法向服务器端的ASP发送请求: _root. pushAc
- 可能不少学习javascript在使用call,apply,callee时会感到困惑,以下希望对于你有所帮助:1、它是函数的方法或属性;2、
- 使用stitcher需要注意,图像太大会报错而且计算慢。特点和适用范围:图像需有足够重合相同特征区域。优点:适应部分倾斜/尺度变换和畸变情形
- 1.--区分大小写select * from a where a=’AbCdE’ collate C
- JavaScript提交至servlet 5种方式:/**第一种提交方式 * */function submitForm1(){window
- privot多对多关系的中间表。PT5框架会自动把privot带上。我们需要隐藏,因为我们不需要privot,而且pritvot也不在我们模
- 问题你想读写一个gzip或bz2格式的压缩文件。解决方案gzip 和 bz2 模块可以很容易的处理这些文件。 两个模块都为 open() 函