编程面试题

  • 用于识别文本文件中的编程语言的代码

    您有文档分类问题。我建议您阅读有关朴素贝叶斯分类器和支持向量

  • 确定有向图还是无向图是一棵树

    对于有向图: 查找没有输入边的顶点(如果存在多个顶点或不存在,则失败)。 从该顶点进行广度优先或深度优先搜索

  • 如何在原处反转UTF-8字符串?

    我将一遍反转字节,然后进行第二遍反转任何多字节字符(在UTF8中很容易检测到)中的字节,使其恢复正确顺序。 您绝对可以一次性完成此任务,但是除非例程成为瓶颈,否则我不会打扰。

  • 如何查找和替换字符串中所有出现的子字符串?

    尝试以下 const std::string s = "*A"; const std::string t = "*A\n"; std::string::size_type n = 0; while n = chartDataString.find s, n != std::string::npos { chartDataString.replace n, s.size, t

  • 用于Minimax的Alpha-Beta修剪

    要了解Alpha-Beta,请考虑以下情况。轮到白人了,白人正试图使分数最大化,黑人正试图使分数最小化。 怀特评估A,B和C的动作,发现C的最佳得分为20。现在考虑评估D时会发生什么: 如果白色选择了D步,我们需要考虑黑色的反步。早期,我们发现黑色可以捕获白色女王,而子树由于丢失了女王而获得的最低分是5。但是,我们尚未考虑所有黑人的反动。是否值得检查其余部分?没有。 我们不在乎黑人是否可以得到

  • 高效的单词打乱算法

    您可以尝试模拟退火,该模拟退火已成功用于许多领域中的复杂优化问题。基本上,您会进行随机爬山,同时逐渐降低随机性。由于您已经获得Aho- Corasick评分,因此您已经完成了大部分工作。您所

  • 给定两个数字的XOR和SUM,如何找到满足它们的对数?

    想想a+b = a XOR b + a AND b*2,当你做二进制加法如发生什么。从您的示例a = 010和b = 111: 010 111 --- 1001 = 101 + 100 对于每一位,你加位a和b(0+0=0

  • 为什么不能使用std :: remove_if从std :: set中删除字符串?

    std::remove_if(或std::erase)通过重新分配范围成员的值来工作。它不了解如何std::set组织数据,或如何从内部树数据结构中删除节点。确实,如果没有set对象本身,仅使用对节点的引用是不可能的。 标准算法设计为具有透明(或至少始终易于记忆)的计算复杂性。set由于需要重新平衡树

  • 从整数流中找到中位数

    参见本文。(可能)需要超过一次通过。想法是在每次通过中计算上限和下限,以使中位数位于它们之间。 此处的基本结果是 N =数据大小, P =通过次数 定理2)选择 N个 元素中第 K 个最高的 P- p

  • 是否有一种就地乘以平方矩阵的算法?

    我对这个答案并不感到兴奋(我主要是为了使“显然不能完成的”人群沉默而发布它),但我怀疑使用真正的就地算法可以做得更好( O(1)个用于存储两个nxn矩阵的额外存储字)。让我们将两个矩阵相乘A和B。假定A和B没有别名。 如果A是上三角的,那么乘法问题看起来像这样。 [a11 a12 a13 a14] [b11 b12 b13 b14] [ 0 a22 a23 a24] [b21

  • 在2D位图上找到质心

    像您的示例一样,基于布尔矩阵的该算法(伪代码)如何: xSum = 0 ySum = 0 points = 0 for point in matrix if point is marked xSum += pointX ySum += pointY points++ return xSumpoints, ySumpoints p

  • 当样本量较大时,计算字符串相似度得分的有效方法吗?

    是的-您可以使用BK-Tree在O(log n)时间内找到字符串给定距离内的所有字符串。对于levenshtein距离1,涉及生成距离为n的每个字符串的替代解决方案可能会更快,但是对于更长的距离,工作量会迅速失控。

  • 如何计算二维数组中相同单元格的组?

    将所有黑色正方形设置为节点。黑色正方形之间的连接(如果 正方形彼此相邻)将是一条边。 图中的DFS将为您提供所有组。请注意,DFS本质上是递归的。

  • 找到有限空间的中位数的概率

    Munro和Paterson在他们的论文《有限的存储空间中的选择和分类》中研究了这个问题。他们表明,您的算法要求k =Ω(√n)才能以恒定概率成功,并且通过吸引有关一维随机游走的基本结果,这是渐近最优的。 如果我想证明绝对最优,那么我要做的第一件事就是考虑一个任意算法A,然后 将

  • 生成Luhn校验和

    编辑 :对不起,我现在意识到您已经几乎了解了我的全部答案,而您只是错误地确定了将哪个系数用于哪个数字。 我的整个答案现在可以用这句话概括: 您已将因子取反,您要根据数字的长度将错误的数字乘以2。 看看有关Luhn算法的a href

  • 子集的积和

    这些是基本对称多项式。您可以像Wikipedia一样使用求和符号来编写它们。您还可以使用Vieta的公式一次获取所有多项式作为多项式的系数(最多为符号)

  • 哪种排序算法最适合非常大的数据集

    没有一种算法显然是“最佳”算法。这取决于许多因素。 首先,您可以将数据放入主存储器吗?如果不能,那么您将需要依赖外部排序算法。这些算法通常基于quicksort和mergesort。 其次,您对您的输入分配了解吗?如果大多数数据是经过排序的,那么像Timsort之类的东西可能是一个不错的选择,因为它被设计为可以很好地处理已排序的数据。如果大多数情况下是随机的,那么Timsort可能不是一个好选择。

  • 这是在C ++ 11中将一个std :: vector的内容移动到另一个的末尾的最有效方法吗?

    性能免责声明:使用性能分析。 性能注意事项: push_back必须为每个调用检查向量的容量是否足以插入元素。编译器不可能足够聪明地避免在循环内进行检查,也就是说,对于每次循环迭代都必须进行检查,这也可能阻止进一步的优化。 如果reserve之前没有调用,push_back则必须在循环中调整向

  • 确定字符串具有所有唯一字符,无需使用其他数据结构,也无需假设使用小写字符

    对于asccii字符集,您可以用4个long表示256位:您基本上是手工编码一个数组。 public static boolean isUniqueCharsString str { long checker1 = 0; long checker2 = 0; long checker3 = 0; long checker4 = 0; for int i = 0; i

  • Python:将复杂的字符串字典从Unicode转换为ASCII

    递归似乎是一种解决方法,但是,如果您使用的是python 2.xx,则要检查unicode,而不是str(str类型代表一个字符串字符串,类型代表一个unicodeUnicode字符字符串;两者都不继承自另一个)并且它是unicode类型的字符串,在解释器中显示,前面带有au)。 在您发布的代码中也有一点语法错

  • PHP中的拓扑排序

    您会得到重复的行,因为存在重复的边。我不是图论专家,但我很确定这是不合法的: 0 = array 0 = 'nominal', 1 = 'subtotal', , 2 = array 0 = 'nominal', 1 = 'subtotal', ,

  • 数据结构和算法电子书

    到目前为止,我最喜欢的算法教科书是Steven Skiena撰写的《算法设计手册》。非常容易阅读,非常实用并且非常有用。本书的前半部分是对算法理论的一般处理,其中包含许多实际示例。后半部分是一个庞大的常见问题库,可以使用哪些算法来解决这些问题,并提供完整的参考文献列表。您不会失望的。

  • 比较两个频谱图以找到它们匹配算法的偏移量

    我想知道您是否可以使用霍夫变换。您将从分类打开序列的每个步骤开始。假设您使用10毫秒的步长,打开序列的长度为50毫秒。您在每个步骤上计算一些指标并获得 1 10 1 17 5 现在,遍历您的音频并分析每个10毫秒的步长,以获取相同的指标。 调用此数组 have_audio 8 10 8 7 5 1 1

  • 在按字典顺序排列的列表中找到给定排列的索引

    我想到了这个解决方案(但我尚未对其进行测试)。 第一位数字的范围是1到N,因此您可以从第一位数字得出排列是否在(N-1)个块中! 2*2! + X where X = 0..2!-1 然后,您可以将其递归地应用于下一个数字(这是(N-1)!排列之一)。 因此,使用任意N可以执行以下算法: X = 0 w

  • 为什么矩阵乘法算法中的循环顺序会影响性能?

    我相信您正在查看的是计算机内存层次结构中引用局部性的影响。 通常,计算机内存被分为具有不同性能特征的不同类型(通常称为 a href="http:

  • Java基准测试递归爬楼梯难题

    前导广告:您可以在不到一毫秒的时间内轻松执行此计算。详细信息如下… 哪一个更好”? 哪种算法“更好”的问题可能涉及执行时间,但也涉及其他方面,例如实现方式。 该Staircase实现更短,更简洁并且恕我直言更易读。更重要的是:它不涉及 状态 。c2您在此处引入的变

  • 如何生成长引导?

    根据您的update2,即使msdn引用了Guid,也可以断定它是正确的。这是一种使用具有加密功能的随机数生成器来创建ID的方法。 static long counter; store and load the counter from persistent storage every time the program loads or closes. public static string Create

  • 如何使用级别顺序遍历序列构造二叉树

    假设使用int[]data具有基于0的索引的数组,我们有一个简单的函数来获取子级: 左子 int getLeftChildint index{ ifindex*2 + 1 = data.length return -1; -1 Means out of bound

  • 查找其总和除以给定数字的数组子数组的数量

    对于给定的数字X… 基本思想:( 带有非正式的正确性证明) 如果范围内的数字总和[a, b]可被整除X,则: ∑i=1 to a-1input[i] % X = ∑i=1 to binput[i] % X 用较少的数学术语来说:

  • 创建非自相交多边形的算法的有效性

    我不确定我是否正确理解您要做什么。在另一个线程中,以及在math.SE的相应线程中(这把我带到了这里),您说您有一个多边形,并试图找到其重心。在这里,您说您有一组点,并且想要从中构造一个不相交的多

  • 计算给定字符串的所有可能的子字符串

    只需使用两个for循环: generate substringsstring: for start in [0,1,...,string.length-1]: for end in [start,...,string.length-1]: yield string[start...end] 您也可以使用以下两个for循环来做

  • HCL颜色为RGB并向后

    我也只是在讲HCL色彩空间。但是,问题中两篇文章中使用的色彩空间似乎是不同的色彩空间。 第二篇文章使用L * C * h(uv),它与L * u * v 相同,但在极坐标系中描述,其中h(uv)是u 和v 坐标系的夹角,而C 是幅度该向量。 第一篇文章中的LCH颜色空间似乎描述了另一种颜色空间,而不是使用更多的算法转换。这里还有第一篇论文的另一个版本:a h

  • 连续添加char以获取字典中最长的单词

    蛮力方法是尝试使用深度优先搜索将字母添加到每个可用索引中。 因此,从“ a”开始,您可以在两个地方添加新字母。在“ a”的前面或后面,由下面的点表示。 .a. 如果添加“ t”,则现在有三个位置。 .a.t. 您可以尝试将所有26个字母添加到每个可用位置。在这种情况下,字典可以是简单的哈希表。如果在中间添加

  • 我在线性时间内合并两个排序列表的实现-有什么可以改进的地方?

    这个问题比您可能需要的更为详尽。;)选择的答案符合您的要求。如果我需要自己执行此操作,则可以按照dbr在他或她的答案中描述的方式进行操作(将列表添加在一起,对新列表进行排序),因为它非常简单。 编辑: 我在下面添加一个实现。我实际上在这里似乎已被删除的另一个答案中看到了这一点。我只是希望它没有被删除,因为它有一个我没有发现的错误。;) def

  • 寻找一个哈希函数/ Ordered Int /到/ Shuffled Int /

    现在的问题是,您是否需要一个真正随机的映射,或者只是一个“弱”排列。假设使用后者,如果您对2的补码算术使用无符号的32位整数(例如)进行运算,则乘以任何奇数是双射且可逆的映射。当然,XOR也是如此,因此您可以尝试使用的简单模式例如 unsigned int hashint x { return x ^ 0xf7f7f7f7 * 0x8364abf7 ^ 0xf00bf00b * 0xf81b

  • 均衡数组所需的最小变换数

    您实际上不需要显示转​​换,但可以找到所需的转换总数。 增加一个元素以外的所有元素与减少一个元素本质上是相同的(出于均衡所有元素的目的)。 策略 :减少所有非最小元素,直到它们等于最小元素。 例如 如果元素是{x1,x2,x3,x4 … xn},则转换次数为 let min = min{x1 .. xn} forint x

  • 使用二进制搜索的多个键的最后索引?

    好吧,感谢所有人,尤其是@Mattias,这种算法听起来不错。无论如何我已经完成了自己的工作,这似乎可以给我更好的结果,但是如果有人可以帮助我确定algos mine和@Mattias的复杂性,或者有人可以提供更好的解决方案,那就欢迎…。无论如何,这是我找到的解决方案, int upperBoundint[] array,int lo, int hi, int key { int lo

  • 在Java中查找集合的所有分区

    您非常接近正确的答案。您说您正在获得无限递归,但实际上程序在最外层循环中以无限循环运行。 与Python代码的主要区别在于,i在Python版本中,变量始终在外循环中前进,但是在Java版本中,i = 1内循环内的语句始终保留i为零。解决此问题的简单方法是对内部和外部循环使用单独的变量。 通常,这就是为什么尝试直接将程

  • 在Mathematica中查找(重复)列表周期的最佳方法是什么?

    请查看注释,以及在代码中穿插的注释,以了解其工作原理。 * True if a has period p * testPeriod[p_, a_] := Drop[a, p] === Drop[a, -p] * are all the list elements the same? * homogeneousQ[list_List] := Length@Tally[list] === 1 homogen

  • 在O(n)和恒定空间中查找重复项

    我们可以在O(n)和恒定空间中做到这一点: 对于每个元素,计算 index = Math.absa[i] - 1 检查值 index 如果为正,则乘以-1,即使其为负。 如果为负,则返回(index+1)作为答案,因为这意味着我们之前已经看到过该