面试金典--面试题 17.19. 消失的两个数字

文章目录

题目描述

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?

以任意顺序返回这两个数字均可。
示例 1:

输入: 1

输出: 2,3
示例 2:

输入: 2,3

输出: 1,4

思路分析

用数学方法做这个题是最简单的。

根据题意,给定 nums 的长度为 n,则补全之后的数组长度为m=n+2。

补全之后的数组和利用等差数列求和公式来做,((1+m)*m)//2。

所以有补全之后的数组总和-未补全的数组总和=缺失的两个数字和。
su = ((1+m)*m)//2-sum(nums)

我们找到缺失数组和的中间值,即 t = su//2。根据题意也知,缺失的两个数字不一样。那么缺失的两个数字必然在t的两侧,或者其中一个和t相等。

那么此时就转变成求 消失的一个数字 了。

直接找到nums里所有小于等于t的数字的和temp。然后再用一次等差数列减去temp,就能得到一个消失的数字了。进而得到第二个消失的数字

完整代码

python 复制代码
class Solution:
    def missingTwo(self, nums: List[int]) -> List[int]:
        
        n = len(nums)
        
        m = n+2
        su = ((1+m)*m)//2-sum(nums)        # 先找缺失值的和

        
        t = su//2

        temp = sum([x for x in nums if x<=t])
        
        res1 = ((1+t)*t)//2 - temp
        return [res1,su-res1]
        ```
相关推荐
SailingCoder9 分钟前
【封闭结束1】端到端交付:Agent 一次请求如何走完全链路
前端·安全·ai·面试·agent·harness
Interview Aid1121 小时前
Uber Interview Process 完整指南:面试流程、OA 真题与 VO 备考
面试·职场和发展
zhangminghuan2 小时前
前端面试应对技巧
前端·面试·职场和发展
Warolitbos5 小时前
【数据库】SQL进阶15题,窗口函数/索引/事务一页速查
数据库·sql·学习·mysql·面试
招聘背调实务专家杨宏6 小时前
背调报告如何判断公开记录与岗位相关性
职场和发展
hunter_0767 小时前
App 被苹果 4.3 拒绝怎么办?从官方条款到整改、沟通与申诉
面试·代码规范
十年Java程序媛7 小时前
Java 面试常问 this、super:构造方法调用顺序避坑
java·开发语言·spring boot·面试·个人开发
weixin_435208167 小时前
大模型面试宝典—大模型(LLMs)基础面
人工智能·职场和发展·agent
ZhengEnCi7 小时前
MCP与Function Calling怎么选:大模型工具调用三种方式的面试级对比
面试·llm·mcp
BreezeJiang7 小时前
闭包和 useState 是两个知识点?你可能只学了半条作用域链
前端·面试