编程面试题

  • 161803398是“特殊”号码吗?在Math.Random()内部

    不,但是它基于Phi(“黄金比例”)。 161803398 = 1.61803398 * 10^8 ≈ φ * 10^8 更多关于黄金分割率的信息。 a href="http:books.google.combooksaboutThe_

  • 为什么FFT产生复数而不是实数?

    FFT基本上是基础的改变。FFT改变原始信号的基础是一组正弦波。为了使该基础描述所有可能的输入,它需要能够表示相位和幅度。该阶段用复数表示。 例如,假设您对仅包含一个正弦波的信号进行FFT。根据相位,您可能会获得完全真实的FFT结果。但是,如果将输入的相位偏移几度,则FFT输出还能如何表示该输入? 编辑:这是一个有点宽松的解释,但我只是想激发直觉。

  • 推荐系统如何工作?

    这是一项具有重要商业意义的应用程序,因此Netflix提出了100万美元的奖金,用于将其推荐水平提高10%。 几年之后,人们越来越近了(我认为他们现在已经上涨了9%左右),但是由于许多很多原因,这很难。Netflix奖的最大因素或最大的初始改进可能是使用一种称为a href="http:en.wikipedia.orgwikiSing

  • 检测字符串是否具有唯一字符:将我的解决方案与“破解编码面试?”进行比较

    这里有两个独立的问题:您的解决方案的效率是多少,参考解决方案的作用是什么?让我们独立对待每个人。 首先,您的解决方案: public static boolean checkForUniqueString str{ boolean containsUnique = false; forchar c : str.toCharArray{ ifstr.

  • 随机二维图块映射生成算法

    我强烈建议您阅读Amit的游戏编程信息和其他博客文章。他撰写了一系列有关用河流,海岸线等绘制逼真的地图的系列文章。 建筑世界 尽管过程图生成可以应用于非网格世界,但它最常用于网格。在单个时间点上查看,生

  • 可以使用哪种算法来识别图像是“相同”还是相似(无论大小)?

    这些算法通常基于指纹。指纹是一个相当小的数据结构,类似于长哈希码。但是,指纹函数的目标与哈希函数的目标相反。一个好的哈希函数应该为非常相似(但不相等)的对象生成完全不同的代码。相反,指纹功能应该为相似的图像生成相同的指纹。 仅举一个例子,这是一个(不是特别好)的指纹功能:将图片调整为32x32正方形,对颜色进行标准化和量化,将颜色数量减少到256之类。然后,您拥有1024字节的指纹为图像。只需保留一张指纹表= [

  • Boyer Moore算法的理解和示例?

    第一条建议,深吸一口气。您显然会感到压力,当您感到压力时,第一件事就是大脑的大部分区域都关闭了。这使理解变得困难,增加了压力,并且您遇到了问题。 5分钟的超时时间可能无法改善您的顶空,但可能会非常有用。 如此说来,该算法基于简单的原理。假设我要匹配一个length的子字符串m。我将首先看一下index上的字符m。如果该字符不在我的字符串中,那么我知道我想要的子

  • 塔之间收集的水

    一旦水落下,每个位置的水位将等于左侧最高塔和右侧最高塔中较小者。 通过向右扫描,找到每个位置左侧的最高塔。然后,通过向左扫描找到每个位置右侧的最高塔。然后在每个位置取最小值,并将它们加起来。 这样的事情应该起作用: int tow[N]; nonnegative tower heights int hl[N] = {0}, hr[N] = {0}; highest-

  • 数组中两个元素的异或最大

    我想我有一个O(n lg U)算法,其中U是最大的数字。这个想法类似于user949300的想法,但有更多细节。 直觉如下。当您将两个数字异或时,要获得最大值,您希望在最高位置上有一个1,然后在此位置上有1的配对中,想要与下一个有1的配对可能的最高位置,等等。 因此算法如下。首先找到数字中任意位置的最高1位(您可以通过对n个数字中的每个数字进行O(lg U)运算,在时间O(n lg U)中进行此操作)。

  • Manacher算法(在线性时间内找到最长回文子串的算法)

    我同意在链接说明中逻辑不正确。我在下面提供一些细节。 Manacher的算法填写表P [i],其中包含以i为中心的回文延伸了多远。如果P [5] = 3,则位置5两侧的三个字符是回文的一部分。该算法利用了以下事实:如果您发现了一个长回文,您可以通过查看左侧的P值来快速填充回文右侧的P值,因为它们大部分应该是相同。 我将首先解释您所讨论的情况,然后根据需要扩展此答案。 R表示回文

  • 如何检查字符串是否完全由相同的子字符串组成?

    关于这样的字符串,有一个漂亮的小定理。 当且仅当字符串本身是非平凡的旋转时,字符串才由重复多次的相同模式组成。 在这里,旋转意味着从字符串的开头删除一些字符并将它们移到后面。例如,hello可以旋转字符串以形成以下任何字符串: hello the trivial rotation el

  • 回溯和深度优先搜索有什么区别?

    回溯是一种更通用的算法。 深度优先搜索是与搜索树结构有关的回溯的一种特定形式。从维基百科: 一个从根开始(在图例中选择一个节点作为根),并在回溯

  • Google面试:块的安排

    这是一个计数问题,而不是构造问题,因此我们可以使用递归来解决它。由于问题有两个自然的部分,即从左侧看和从右侧看,因此将其分解并首先解决一个问题。 让bN, L, R是解决方案的数量,并让fN, L是安排数N块,这样L是从左边可见。首先考虑一下,f因为它更容易。 strong

  • 给定一百万个数字的字符串,返回所有重复的3位数字

    您轻轻松松下手,您可能 不想 在对量子点不了解基本算法的对冲基金中工作:- 在这种情况下,如果您需要至少访问一次每个元素,则 无法 处理任意大小的数据结构O1。在这种情况下,您可以期望的 最好 是字符串的长度。On``n 虽然,顺便说一句,标称co

  • 确定音频样本密钥的算法

    值得注意的是,这是一个非常棘手的问题,如果您没有信号处理方面的背景(或者对学习它没有兴趣),那么您将面临非常沮丧的时间。如果您希望解决这个问题,那么您会走得很远。我希望您确实对此感兴趣,因为它是一个非常迷人的领域。 最初存在音高识别问题,使用简单的单声乐器(例如语音),使用自相关或谐波和谱等方法(例如,参见Paul R的链接),该问题相当容易实现。但是,您经常会发现这样做会产生错误的结果:您经常会得到预期的音高的一半或两

  • 如果该行或列包含0,则将矩阵中的每个单元格设置为0

    好的,我在这里是凌晨3点,所以很累,但是我第一次尝试对矩阵中的每个数字进行精确2次遍历,所以在O(NxN)中,矩阵的大小是线性的。 我使用第一列和第一行作为标记来知道哪里只有1的行列。然后,有2个变量l和c可以记住第一个行列是否也都是1。因此,第一遍设置标记并将其余的重置为0。 第二遍在行和列标记为1的位置设置1,并根据l和c重置第一行列。 我强烈怀疑我能否一口气完成,因为一开始的方块取

  • 棘手的Google面试问题

    Dijkstra在“编程纪律”中得出了雄辩的解决方案。他将问题归因于汉明。这是我对Dijkstra解决方案的实现。 int main { const int n = 20; Generate the first n numbers std::vectorint vn; v[0] = 1; int i2 = 0;

  • 生成算法和判别算法有什么区别?

    假设您有输入数据,x并且想要将数据分类为label y。生成模型学习 联合 概率分布,px,y而判别模型学习 条件 概率分布py|x-您应将其理解为 “y给定概率x”。

  • 使用1 MB RAM对1百万个8位十进制数字进行排序

    仅由于1兆字节和1百万字节之间的差异,才可能找到解决方案。8093729.5的幂大约有2种,可以选择100万个8位数字(允许重复且顺序不重要),因此一台仅具有100万字节RAM的计算机没有足够的状态来表示所有可能性。但是1M(对于TCP IP,小于2k)是1022 * 1024 * 8 = 8372224位,因此可以解决。 第1部分,初始解决方案 这种方法所

  • 查找给定集合的所有子集的总和

    对于输入{x 1,…,x n },返回2 n-1(x 1 +…+ x n),因为每个项都以这么多的和出现。

  • 在大小为n的数组的所有大小为L的连续子数组中找到最小值

    您可以使用双头队列(Q)。找到一种方法,使最小的元素始终出现在Q的前面,并且Q的大小永远不会超过L。因此,解决方案总是始终最多插入和删除元素上)。我觉得这足以使您前进。

  • 查找给定对的解决方案(因子数量,主要因子数量)

    令 p 1, p 2, p 3,… p k 为某个正整数 n 的素因子。由算术基本定理, Ñ 可以被表示为 p 1 ëem

  • 什么是此代码而不是double for循环(python)的更快版本?

    创建一个地图{letter; int}和activecount计数器。 让两个指标left和right设置他们0。 移动right索引。 如果l=s[right]为字母,则为地图键的增量值l。 如果值变为非零增量co

  • 查找唯一除数的最佳算法

    下面是一个明显的优化方法- 筛选掉橡皮擦以将所有数字增加到您所知道的值高于给定列表中任何一个的值。现在,您可以遍历该列表中给定数字的所有因子。 接下来要做的是:对于列表中的每个数字及其每个素数p,都应将N除以p,直到将其整除。完成后,您要查找的除数就是剩余数的所有除数。

  • 画家难题-估计

    这里有很多未知数-他的步行速度,绘画速度,刷子中的油漆能持续多久… 但是显然这里有两个过程。一个是平方的-是在油漆罐和油漆点之间来回走动。另一个是线性的-这是绘画的过程本身。 考虑到第10天甚至第100天,很明显,线性分量可以忽略不计,并且该过程几乎变为二次方-几乎所有时间都在走动。相反,在第一天的前几分钟内,它接近线性。 因此我们可以说,时间 t 作为距离 se

  • 通过迷宫必须穿越的起点和终点之间的最小距离

    好的,所以也许我会再尝试解决这个问题。上次,我没有注意到您可以多次访问一个点的事实,因此建议可能是错误的。 首先,假设“开始”,“结束”和“灰色”节点的总数为N,并且“开始”为0,“结束”为N-1,“灰色”节点的总数为1到N-2。 我们可以看到我们可以state随时mask, index用表示,其中index表示我们所在的当前节点,mask表示我们已经访问

  • 可调整大小的数组和摊销的运行时

    我认为您最好像这样理解上面的声明。 首先。数组大小仅为1.,然后将其插入一个元素。现在阵列已满!您必须将其调整为上一个的2倍。 接下来,数组大小为2。让此过程继续进行。您可以很容易地注意到,必须调整数组大小的时刻是1、2、4、8、16、32,…,2 ^ r。 我会给你问题。 您需要多少次调整数组大小? 直到N(N = 0)个

  • for i的复杂度是什么:for o = i + 1

    它 是 N ^ 2,因为它是两个线性复杂的产品。 (将渐进复杂度称为 渐进 而不 相同 的原因是有原因的…) 有关简化的信息,请参见a href="ht

  • 选择性迭代器

    std::string const str = "some:word{or other"; std::string result; result.reservestr.size; for std::string::const_iterator it = str.begin, end = str.end; it != end; ++it { if isalnum*it { re

  • 您如何通过3D网格进行线性迭代?

    假设您的立方体边长为s = sx, sy, sz,射线方向为d = dx, dy, dz,起点为p = px, py, pz。然后,您要遍历的射线是rt = p + t * d,其中t是任意正数。 让我们关注一个维度。如果您当前位于多维数据集的下边界,那么dt

  • 使用Canvas为JS中的排序算法制作动画

    一种解决方案是ES6 Generatorfunction*及其yield声明。 这使您可以暂停功能,并在暂停的位置稍后重新启动它: N =

  • 通过Python使用Spark准备我的大数据

    您可以使用一些基本的pyspark转换来实现此目的。 rdd = sc.parallelize[1424411938, [3885, 7898],3333333333, [3885, 7898]] r = rdd.flatMaplambda x: a,x[0] for a in x[1] 我们曾经c

  • 计算N个数的LCM模1000000007

    1000000007太大了,我不能举个例子。让我17举个例子: LCMS10, 9, 8 % 17 = LCM10, LCM9, 8 % 17 = LCM10, 72 % 17 = 360 % 17 = 3 这是您的代码执行的操作: LCMS10, 9, 8 % 17 =

  • 布雷森纳姆线无对角线运动

    应该是微不足道的修改-假设您位于I象限-即向上和向右移动。而不是做一个对角线,而是做一个向上…然后是一个右。 代替: for x from x0 to x1 plotx,y error := error + deltaerr if error ≥ 0.5 then y := y

  • Javascript按算法排序,可能是jquery

    是的,setTimeout如果您想“查看”算法的进度,这是一个好主意。但是,setTimeout仅接受函数作为参数,因此排序算法的每次迭代都必须在单独的函数中执行。请参见以下代码作为示例(该代码不会在每次迭代中产生输出,而是会为交换操作“动画化”,但是我敢肯定,您可以轻松地调整它以适应您的需求)。 a href="http:jsfiddle.netAletheiosV

  • 双for循环的运行时间复杂度

    这两个都是 O(n 2) 您的代码有一个方便的机制来测量时间复杂度,这就是sum变量 去用不同的值实现它n。如果您sum划一条线,那是线性的。如果不是,那不是线性的。我认为你会发现,你的第一个算法,sum将永远是准确n^2

  • 如何在Java中为数组创建HeapSort方法?

    这就是它。 public static void heapSortComparable[] a, int size { MaxHeapPriorityQueue mhpq = new MaxHeapPriorityQueue; mhpq.elementData = a; mhpq.size = size; for int i = size2-1; i =

  • 计算采取1、2或3步后n步的爬升方式

    我不明白为什么要为n = 0返回1。如果有0步,那么显然我们不必爬任何步,应该返回0。 当没有台阶时,您只是不爬而经过,这是唯一的一种方法。正如评论之一所指出的那样,它可以表示为。 对于n = 3,函数返回4,但我只能看到3种情况,即(1,1,1),(1,2),(3)。

  • 寻找完美平方算法的优化

    我将从介绍一些辅助方法(factors和square?)开始,以使您的代码更具可读性。 此外,我将减少范围和数组的数量以提高内存使用率。 require 'prime' def factorsnumber [1].tap do |factors| primes = number.prime_division.flat_map

  • Mergesort的执行速度很慢

    示例合并排序是在merge()中进行数据的分配和复制,并且可以通过更有效的合并排序消除两者。可以在helper entry函数中对temp数组进行单个分配,并且可以通过使用两个相互递归函数(如下面的示例)或使用布尔值来根据递归级别更改合并方向来避免复制参数。 这是经过合理优化的C ++自上而下合并排序的示例。自底向上合并排序会稍快一些,在具有16个寄存器的系统上,四向底合并排序仍然要快一些,大约快于快速排序。