简单的面试问题变得更难:给定数字 1..100,在给定 k 个缺失的情况下找到缺失的数字

2024-04-12

不久前我有过一次有趣的求职面试经历。这个问题一开始很简单:

Q1:我们有一个装有数字的袋子1, 2, 3, …, 100。每个数字只出现一次,所以有 100 个数字。现在从袋子里随机选出一个号码。找到丢失的号码。

当然,我以前听说过这个面试问题,所以我很快就回答了以下内容:

A1: 嗯,数字的总和1 + 2 + 3 + … + N is (N+1)(N/2) (see 维基百科:算术级数之和 http://en.wikipedia.org/wiki/Arithmetic_sum#Sum). For N = 100,总和是5050.

因此,如果袋子中存在所有数字,则总和将恰好为5050。由于缺少一个数字,因此总和将小于此数字,差值就是该数字。所以我们可以找到缺失的数字O(N)时间和O(1) space.

到这里我以为自己已经做得很好了,但是突然问题来了个意想不到的转折:

Q2:这是正确的,但现在如果TWO数字缺失?

我以前从未见过/听说过/考虑过这种变化,所以我惊慌失措,无法回答这个问题。面试官坚持要了解我的思考过程,所以我提到也许我们可以通过与预期产品进行比较来获得更多信息,或者可能在从第一遍收集了一些信息后进行第二遍等等,但我真的只是在拍摄在黑暗中而不是实际上有一条清晰的解决方案。

面试官确实试图鼓励我,说拥有第二个方程确实是解决问题的一种方法。此时我有点沮丧(因为事先不知道答案),并询问这是否是一种通用的(读:“有用的”)编程技术,或者它是否只是一个技巧/陷阱的答案。

面试官的回答令我惊讶:你可以推广该技术来找到 3 个缺失的数字。事实上,你可以概括它来找到k缺少数字。

Qk: 如果确实如此k包里的号码不见了,你如何有效地找到它?

这是几个月前的事了,我仍然不明白这个技术是什么。显然有一个Ω(N)时间下限,因为我们必须至少扫描一次所有数字,但面试官坚持认为TIME and SPACE求解技术的复杂性(减去O(N)时间输入扫描)定义在k not N.

所以这里的问题很简单:

  • 你会如何解决Q2?
  • 你会如何解决Q3?
  • 你会如何解决Qk?

澄清

  • 一般有N数字从 1..N,不仅仅是 1..100。
  • 我并不是在寻找明显的基于集合的解决方案,例如用一个bit set http://en.wikipedia.org/wiki/Bit_array,通过指定位的值对每个数字的存在/不存在进行编码,因此使用O(N)额外空间中的位。我们无法承担与以下比例成比例的任何额外空间N.
  • 我也不是在寻找明显的排序优先方法。这种方法和基于集合的方法在采访中值得一提(它们很容易实现,并且取决于N,非常实用)。我正在寻找圣杯解决方案(它可能会也可能不会实际实施,但仍然具有所需的渐近特性)。

所以同样,你当然必须扫描输入O(N),但您只能捕获少量信息(定义为k not N),然后必须找到k不知何故缺少数字。


这里有一个总结迪米特里斯·安德烈欧 https://stackoverflow.com/questions/3492302/easy-interview-question-got-harder-given-numbers-1-100-find-the-missing-number/3492664#3492664 .

记住 i 次方的和,其中 i=1,2,..,k。这将问题简化为求解方程组

a1 + a2 + ... + ak = b1

a12 + a22 + ... + ak2 = b2

...

a1k + a2k + ... + akk = bk

Using Newton's identities https://en.wikipedia.org/wiki/Newton_identities#Formulation_in_terms_of_symmetric_polynomials, knowing bi allows to compute

c1 = a1 + a2 + ... ak

c2 = a1a2 + a1a3 + ... + ak-1ak

...

ck = a1a2 ... ak

If you expand the polynomial (x-a1)...(x-ak) the coefficients will be exactly c1, ..., ck - see Viète's formulas https://en.wikipedia.org/wiki/Vi%C3%A8te's_formulas. Since every polynomial factors uniquely (ring of polynomials is an Euclidean domain https://en.wikipedia.org/wiki/Euclidean_domain), this means ai are uniquely determined, up to permutation.

这就证明了记住幂就足以恢复数字。对于常数 k,这是一个很好的方法。

However, when k is varying, the direct approach of computing c1,...,ck is prohibitely expensive, since e.g. ck is the product of all missing numbers, magnitude n!/(n-k)!. To overcome this, perform computations in Zq field https://en.wikipedia.org/wiki/Finite_field_arithmetic, where q is a prime such that n <= q < 2n - it exists by Bertrand's postulate https://en.wikipedia.org/wiki/Bertrand's_postulate. The proof doesn't need to be changed, since the formulas still hold, and factorization of polynomials is still unique. You also need an algorithm for factorization over finite fields, for example the one by Berlekamp https://en.wikipedia.org/wiki/Berlekamp's_algorithm or Cantor-Zassenhaus https://en.wikipedia.org/wiki/Cantor%E2%80%93Zassenhaus_algorithm.

常数 k 的高级伪代码:

  • 计算给定数字的 i 次方
  • Subtract to get sums of i-th powers of unknown numbers. Call the sums bi.
  • Use Newton's identities to compute coefficients from bi; call them ci. Basically, c1 = b1; c2 = (c1b1 - b2)/2; see Wikipedia for exact formulas
  • Factor the polynomial xk-c1xk-1 + ... + ck.
  • The roots of the polynomial are the needed numbers a1, ..., ak.

对于变化的 k,使用例如找到素数 n

EDIT: The previous version of this answer stated that instead of Zq, where q is prime, it is possible to use a finite field of characteristic 2 (q=2^(log n)). This is not the case, since Newton's formulas require division by numbers up to k.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单的面试问题变得更难:给定数字 1..100,在给定 k 个缺失的情况下找到缺失的数字 的相关文章

  • C++ 通过引用传递动态分配的二维数组

    这个问题是基于之前提出的问题而提出的 通过已知大小的引用多维数组传递 https stackoverflow com questions 529109 c pass by reference multidimensional array w
  • 颜色变换器功能上的堆栈溢出错误

    我有两种颜色 红色 和 鲑鱼色 我需要动态创建面板以及面板背景颜色 这些颜色必须介于两种颜色之间 红色 public Color x y protected void Page Load object sender EventArgs e
  • 将数组传递给函数 - 指针与引用(C++ 与 C)

    我有一个关于将数组传递给函数的最佳实践的广泛问题 因此 过去当我用 C 语言编程时 我想要一个函数的输入是一个数组 我会声明该函数的输入参数是一个指针 这效果相对较好 然而 我已经开始更多地使用 C 进行编程 并试图确定将数组传递到函数中的
  • 计算序列而无法存储值?

    问题陈述 here http www spoj com problems EC SER 令 S 为无限整数序列 S0 a S1 b Si Si 2 Si 1 对于所有 i gt 2 你有两个整数 a 和 b 您必须回答有关序列中第 n 个元
  • 调度算法,找到设定长度的所有非重叠区间

    我需要为我的管理应用程序实现一种算法 该算法将告诉我何时可以将任务分配给哪个用户 我实现了一个蛮力解决方案 它似乎有效 但我想知道是否有更有效的方法来做到这一点 为了简单起见 我重写了算法以对数字列表进行操作 而不是数据库查询等 下面我将尝
  • 你能用 C# 编写一个同样优雅的排列函数吗?

    我非常喜欢这个 6 行解决方案 并尝试在 C 中复制它 基本上 它会排列数组的元素 def permute xs pre if len xs 0 yield pre for i x in enumerate xs for y in perm
  • 如何使用现有列表创建二维数组?

    例如 我有一个名为 mazeline 的 txt 数据 如下所示 abcd cdae korp 所以我首先列出了 3 个清单 mazeline readmaze split mline0 list mazeline 0 mline1 lis
  • AWK数组初始化

    是否可以使用常见的方法在AWK中初始化数组list syntax array val1 val2 val3 或者是否必须使用索引值 syntax array 0 val1 array 1 val2 array 2 val3 不 不 您可以这
  • 如何发布数组多维角度js

    我在 angularjs 中有一个数组 示例如下 scope order qty 20 scope order adress Bekasi scope order city Bekasi 这个数组可以用这个代码发布 http method
  • 从二叉堆中查找第 k 个最小元素的 O(klogk) 时间算法

    我们有一个 n 节点二叉堆 其中包含n不同的项目 根部的最小项目 为一个k lt n 发现O klogk 时间算法选择kth堆中的最小元素 O klogn 很明显 但无法找出O klogk 一 也许我们可以使用第二个堆 但不确定 好吧 你的
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 添加边后更新最大流量

    考虑我们有一个网络流量 并使用 Edmond Karp 算法 我们已经拥有网络上的最大流量 现在 如果我们向网络添加任意边 具有一定容量 更新最大流量的最佳方法是什么 我正在考虑更新关于新边缘的残差网络 并再次寻找增强路径 直到找到新的最大
  • 在 C 中将字符追加到字符数组

    我想将一个字符附加到代表字符串的字符数组中 我正在使用结构来表示字符串 struct String char c int length int maxLength String realloc弄乱了我的数组 当我打印字符串时 它会从内存中打
  • 高度并行化的Levenshtein距离算法

    实际上 我必须实现一个字符串比较 最后得到匹配百分比 不仅仅是布尔结果匹配 不匹配 为此 我找到了 Levenstein 距离算法 但现在的问题是性能 例如 我有 1k 个字符串需要相互比较 现在大约需要 10 分钟 对于每个算法 我已经并
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • 为什么这两种不同的构造数组的方式会产生不同的行为?

    当我以两种不同的方式构造一个 2 元素数组时 例如a and b 当我将一个元素添加到内部数组之一时 我得到两个不同的结果 这也会发生在append 根据构建每个之后的输出 我希望它们完全相同 julia gt a 2 element Ar
  • PHP 中只保留数组的前 N ​​个元素? [复制]

    这个问题在这里已经有答案了 有没有办法只保留数组的前 N 个 例如 10 个 元素 我知道有array pop 但是有没有更好 更优雅的方法呢 您可以使用array slice http php net array slice or arr
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • Repa 数组上的并行 mapM

    在我最近的work https github com bgamari mixture model with Gibbs sampling 我一直在充分利用RVar http hackage haskell org packages arch
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 删除列表中复杂度优于 O(n^2) 的子字符串

    我有一个包含许多单词 100 000 的列表 我想做的是删除列表中每个单词的所有子字符串 因此 为了简单起见 我们假设我有以下列表 words Hello Hell Apple Banana Ban Peter P e 以下输出是所需的 H
  • 同时获取logcat和内核日志

    我正在尝试通过以下命令获取日志 logcat 和 kmsg logcat v 时间 f dev kmsg cat proc 但是我不确定日志文件存储在哪里以及它的名称是什么 我如何识别它 好的 这是谷歌快速搜索的结果 安卓日志系统 http
  • Haskell 中的 undefined 和 Java 中的 null 有什么区别?

    两者的类型都是所有类型的交集 无人居住 两者都可以在代码中传递而不会失败 直到尝试评估它们为止 我能看到的唯一区别是 在 Java 中 有一个漏洞允许null仅针对一个操作进行评估 即引用相等比较 而在 Haskell 中undefined
  • 设置特定文件的 AWS S3 过期时间

    我阅读了 PHP AWS SDK 文档 https docs aws amazon com aws sdk php v2 api class Aws S3 S3Client html https docs aws amazon com aw
  • 二分布局Gephi 0.9.1

    我的问题简单得令人尴尬 how do i plot a bipartite graph in Gephi with a layout like the one you see in the attached image 我真的无法在Geph
  • 是否可以通过显式类型转换将基类对象分配给派生类引用?

    是否可以在 C 中使用显式类型转换将基类对象分配给派生类引用 我已经尝试过了 它会产生运行时错误 不可以 对派生类的引用实际上必须引用派生类的实例 或 null 否则你会期望它如何表现 例如 object o new object stri
  • Jetty 返回 403 Forbidden

    您好 我正在将我的网络应用程序从 tomcat 移植到 Jetty 我正在使用 Jetty runner 来启动它 我使用以下命令来启动 Jetty java jar jetty runner jar port path url path
  • psql 显示 ansi 彩色文本

    My psqlrc有以下选项 setenv LESS iMSx4 FXR setenv PAGER less pset pager always 我想要着色的 psql 输出是 x1B 35m x1B 0m x1B 35mr x1B 0m
  • 检测Python字符串是数字还是字母[重复]

    这个问题在这里已经有答案了 如何检测字符串中的数字或字母 我知道您使用 ASCII 代码 但是哪些函数利用了它们呢 检查字符串是否为非负的数字 整数 和字母 您可以使用str isdigit https docs python org 2
  • 使用 async/await 锁定资源

    我有一个应用程序 其中有一个可由多个客户端访问的共享资源 运动系统 我有一些单独的操作 需要在移动期间访问系统 并且如果同时请求冲突的操作 则应抛出 繁忙 异常 我还有序列器 它们需要获得对运动系统的独占访问权限 以执行多个操作 并穿插其他
  • Objective-C 类别性能

    如果我使用类别将 Objective C 类的实现分解为多个 implementation块 这会使我的 iOS 应用程序生成的二进制文件更大或根本影响性能吗 显然 你不能在运行时获取类的类别详细信息 https stackoverflow
  • 为什么从 App.xaml 设置样式 TargetType="Window" 不起作用?

    我正在 VS2013 中创建一个简单的 WPF 项目 我想将属性应用到我的主窗口 我将它们设置在我的App xaml像这样的文件
  • “入队”和“出队”之间的区别

    有人可以解释一下主要区别吗 我对任何语言编程中的这些函数都没有明确的了解 C 和 C 等编程语言中的一些基本数据结构是堆栈和队列 堆栈数据结构遵循 先进后出 策略 FILO 其中插入或 推入 堆栈的第一个元素是最后一个从堆栈中删除或 弹出
  • 使用 jquery ajax 的两个 CORS 请求之间的时间间隔

    我正在使用 jQuery 向 Web 服务发出 CORS 请求 ajax 根据标准 有一个飞行前请求 然后是实际的 POST 请求 我注意到 每次我尝试进行 Web 服务调用时 都会有两个请求 一个是飞行前请求 一个是实际的 POST 请求
  • ASP.NET - 将 JSON 从 jQuery 传递到 ASHX

    我正在尝试将 JSON 从 jQuery 传递到 ASHX 文件 下面的 jQuery 示例 ajax type POST url test ashx data file dave type ward contentType applica
  • SQL Regex 函数类似于 MySql REGEX 函数

    我正在寻找一个能够执行与 TSQL 的 MySQL REGEX 函数相同的操作的函数 基本上我需要我的查询如下所示 SELECT FROM Routing WHERE Message REGEX RouteRegex 我现在不太热衷于使用
  • C++处理文件文件末尾的空行

    当我使用c 处理文件时 我发现文件末尾总是有一个空行 有人说vim会在文件末尾追加一个 n 但是当我使用gedit时 它也有同样的问题 谁能告诉我原因吗 1 include
  • GCC 4.7.2:带有指向成员函数指针的 std::thread

    在编写测试代码时这个问题 https stackoverflow com questions 15080015 stdthread with pointer to data member我发现下面的注释行无法在 GCC 4 7 2 上编译
  • 为什么Hadoop文件系统不支持随机I/O?

    分布式文件系统 例如 Google 文件系统和 Hadoop 不支持随机 I O 不能修改之前写入的文件 只能写入和追加 他们为什么要这样设计文件系统 该设计有哪些重要优点 P S 我知道 Hadoop 将支持修改写入的数据 但他们表示 它
  • 简单的面试问题变得更难:给定数字 1..100,在给定 k 个缺失的情况下找到缺失的数字

    不久前我有过一次有趣的求职面试经历 这个问题一开始很简单 Q1 我们有一个装有数字的袋子1 2 3 100 每个数字只出现一次 所以有 100 个数字 现在从袋子里随机选出一个号码 找到丢失的号码 当然 我以前听说过这个面试问题 所以我很快