LeetCode/面试题消失的数字

Posted Weraphael

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode/面试题消失的数字相关的知识,希望对你有一定的参考价值。

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:Leetcode + 面试/笔试
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注


目录

一、题目描述

链接:消失的数字

二、思路及代码实现

2.1 法一:数学公式法

思路:可以先求出0~n所有整数的和,整数的和可以利用等差数列求和:Sn = n ( a 1 + a n ) 2 n(a_1 + a_n) \\over 2 2n(a1+an),然后再分别让Sn减去数组内的元素,最后的结果就是消失的数字。对于时间复杂度,只遍历一次数组,所以时间复杂度为O(N)符合题目要求。

【代码实现】

int missingNumber(int* nums, int numsSize)

    //求出0~n的和
    int total_sum = numsSize * (numsSize + 1) / 2;
    for (int i = 0;i < numsSize;i++)
    
        //用总和减去数组内的元素
        total_sum -= nums[i];
    
    //最后的元素就是消失的数字
    return total_sum;

代码解析
浅浅解释一下numsSize * (numsSize + 1) / 2。这里的numsSize指的是消失数字的元素个数,根据公式:Sn = n ( a 1 + a n ) 2 n(a_1 + a_n) \\over 2 2n(a1+an),因为要求出没有消失数字的总和,所以总的元素个数为numsSize + 1,a1永远都是0,而最后的an恰好是消失元素个数的总和,也就是numsSize

2.2 法二:按位异或

这篇博客详细讲解了按位异或等操作符:操作符详解
这里简单总结一下按位异或操作符(^)

  • 计算规则:对应的二进制位相异为1,相同为0
  • a ^ a = 0 、0 ^ a = a、a ^ b = b ^ a

解题步骤如下(以示例一数据为例):
可以让原始数组的每一个元素分别与0~n异或即可找出消失的数据

  1. 那如何让原始数组的每一个元素分别与0~n异或呢?首先可以用0异或数组每一个元素,因为0 ^ 任何数 = 任何数。即0 ^ 3 ^ 0 ^ 1
  2. 再把第一步异或完数据分别再与0~n异或。即0 ^ 3 ^ 0 ^ 1 ^ 0 ^ 1 ^ 2 ^ 3
  3. 最后计算出的结果就是2,即消失的数字

【代码实现】

int missingNumber(int* nums, int numsSize)

    int n = 0;
    for (int i = 0;i < numsSize;i++)
    
        n ^= nums[i];
    
    for (int i = 0;i < numsSize + 1;i++)
    
        n ^= i;
    
    return n;

Leetcode刷题日记(2020.7.13)程序员面试经典:消失的两个数字

题目描述如下:

 

 

 分析如下:

此题目乍一看挺难的没有思路,其实很简单,他要找消失的两个数字,那么也及时其实原数组应该是在现有输入数组的基础上加上两个数字,此时range()函数就可以上场了,但是很多人说,你这样会有重复哎,咋办呢,直接使用set()去重复即可。

代码如下:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 """
 4 # @Time : 2020/7/13 10:23 
 5 
 6 # @Author : ZFJ
 7 
 8 # @File : 消失的两个数字.py 
 9 
10 # @Software: PyCharm
11 """
12 
13 
14 class Solution(object):
15     def missingTwo(self, nums):
16         """
17         :type nums: List[int]
18         :rtype: List[int]
19         """
20         result = list(set(range(1, len(nums) + 3)) - set(nums))
21         return result
22 
23 
24 if __name__ == "__main__":
25     test = Solution().missingTwo(nums=[1])
26     test2 = Solution().missingTwo(nums=[2, 3])
27     print(f"第一组中缺失的两个数字是:{test}")
28     print(f"第二组中缺失的两个数字是:{test2}")

运行消耗如下:

 

以上是关于LeetCode/面试题消失的数字的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:16.面试题 17.04. 消失的数字

LeetCode 面试题 17.19. 消失的两个数字

LeetCode 面试题 17.19 消失的两个数字[排序] HERODING的LeetCode之路

LeetCode 面试题 17.19 消失的两个数字[排序] HERODING的LeetCode之路

力扣leetcode 面试题消失的数字题解

Leetcode刷题日记(2020.7.13)程序员面试经典:消失的两个数字