编程面试题

  • 素数算法

    您需要创建一个布尔数组,该数组与要查找的最大素数一样大。在开始时,它已完全初始化为true。 i如果i是素数,则此数组的th单元将为true ,否则为false。 从i=2:质数开始迭代,然后将索引倍数为2的任何单元格设置为false。转到下一个质数(i=3)并执行相同的操作。转到下一个素数(它是

  • Boost :: multi_array上与维度无关的循环?

    好的,根据注释中已经提到的Google小组讨论以及库本身的示例之一,这是一个可能

  • 在图中至少访问X个节点的图中找到最短路线

    这是一个可能足够快的解决方案: 1)从每个蓝色节点运行最短路径搜索算法(可以在O(X *(E log N)中完成))以计算成对距离。 2)建立一个仅包含零个顶点和蓝色顶点(X + 1个顶点)的新图形。使用第一步中计算的成对距离添加边。 3)新的图形足够小,可以使用针对TSP的动态编程解决方案(它具有O(X ^ 2 * 2 ^ X)时间复杂度)。

  • 如何将后缀表达式放在二叉树中?

    要从表达式构造树,请假装您直接对它求值,但构造树而不是计算数字。(此技巧比后缀表达式有用得多。) 算法: 有一个堆栈来存储中间值(即树),并从左到右检查每个令牌: 如果是数字,则将其变成叶子节点,然后将其压入堆栈。 如果是运算符,请从堆栈中弹出两个项目,使用这些子元素构造一个运算符节点,然后将新节点压入堆栈。

  • 大哦符号-正式定义

    请记住,您正在寻找“当n足够大时f(n)的上限”。因此,如果您可以证明对于大于 n的n值 ,f(n)小于或等于某些c g(n),则意味着c g(n)是f(n)和f(因此,n)的复杂度为O(g(n))。 给出的示例旨在表明,对于任何n N,给定的函数f(n)永远都不能超过c * g(n)。通过操纵初始上限,可以使其更简单地表示(如果4n ^ 2 + 50n是f(n

  • 生成给定长度的所有可能的一和零的数组的算法

    您将如何在纸上手动计数?您将检查最后一位数字。如果为0,则将其设置为1。如果已经为1,则将其设置回0,然后继续下一个数字。因此,这是一个递归过程。 以下程序通过更改序列来生成所有可能的组合: #include iostream template typename Iter bool nextIter begin, Iter end { if beg

  • 对于给定的fp精度,检查数字在Python中是否合理

    在python = 2.6中,有一个as_integer_ratio关于float 的方法: a = 6.75 a.as_intege

  • A星:启发式实现多个目标

    有几千个目标?如果十数条行之有效,如果成千上万种,那么最近的邻居搜索将为您提供设置数据以快速搜索的想法。 权衡是显而易见的,在空间上组织数据以进行搜索将需要时间,而在小型集合上,蛮力将更易于维护。由于您一直在进行评估,因此我认为在很少的情况下构造数据是值得的。 另一种执行此操作的

  • iota_n(STL的缺失算法)将是一个很好的实现

    作为一个随机示例,我使用g++ -S -O2 -masm=intel(GCC 4.7.1,x86_32)编译了以下代码: void fill_it_upint n, int * p, int val { asm volatile"DEBUG1"; iota_np, n, val; asm volatile"DEBUG2"; iota_mp

  • 通过引用将函数对象传递给std算法

    通过转发引用而不是按值传递函数对象到STL算法中更好吗? 是的,这样会更好。如果有必要要求函子不必为,或CopyConstructible,那会更好。但是该标准在25.1中明确指出:CopyAssignable``MoveConstructible``MoveAssignable blockquote

  • Boost中rtree中的打包算法

    您只需要使用a href="http:www.boost.orgdoclibs1_58_0libsgeometrydochtmlgeometryreferencespatial_indexesboost__geometry__index__rtreertree_range_const___.html#classboost_1_1geometry_1_1index_1_1rtree_1a7b96b715c52ddc13

  • 模拟嵌套循环

    因为这是对嵌套循环的递归调用。首先,用0调用它。然后用1调用。然后用2.调用。当达到总循环数时,它开始执行循环(这称为递归终止条件)。但是,对嵌套循环的每次调用都放在堆栈上,它执行k,然后返回并执行k-1,然后返回并执行k-2,然后返回并执行k-3一直到k-k = 0 。 如果我是你,我会在自身内部的nestedloops()调用上放置一个断点,并观察其被调用的内容。然后,正如人们所说的那样,观察它向下运行的方式

  • VBA气泡排序算法慢

    首先:不要在5000行上使用冒泡排序!这将需要5000 ^ 22次迭代,即12.5B次迭代!最好使用像样的QuickSort算法。在本文的底部,您将找到一个可以用作起点的文章。它仅比较第1列。在我的系统上,花费了0.01秒的排序(而不是优化冒泡排序后的4秒)。 现在,面对挑战,请查看下面的代码。它以原始运行时间的〜30%运行-同时显着减少了代码行。 主要杠杆是:

  • 查找矩阵从[0,0]到最后一行的长度为N的最大成本路径的算法

    您可以使用动态编程解决此问题。让valuei, j值从i, j矩阵的位置开始(第i行,第j列)。 if i 0 then fi, j = 0 if i == 0 then fi, j = valuei, j if i 0 then fi, j = maxfi-1, j, fi, j-1 + value

  • MySQL混合Damerau–Levenshtein Fuzzy与Like通配符

    在使用人名并对其进行模糊查找时,对我来说有效的是创建第二个单词表。还创建第三个表,该表是一个相交表,用于包含文本的表和单词表之间的多对多关系。将一行添加到文本表后,您将文本拆分为多个单词并适当地填充了相交表,并在需要时向单词表中添加了新单词。一旦建立了这种结构,您就可以更快地进行查找,因为您只需要对唯一单词表执行damlev函数。一个简单的联接将为您提供包含匹配单词的文本。 img alt="在此处输入图片说明" src="https:

  • 两个字符串列表的交集

    将一个列表放入Bloom过滤器中,然后使用它过滤第二个列表。 将已过滤的第二个列表放入Bloom过滤器中,并使用该过滤器过滤第一个列表。 对两个列表进行排序,并通过上述方法之一找到交点。 这种方法的好处(除了允许您在采访中正确使用半模糊

  • 在B树中找到第k个密钥的算法?

    好的,经过几个小时的不眠不休,我设法做到了,对于任何想知道如何做的人,这里都是伪代码(第一个元素k = 0): get_k-thcurrent, k: for i = 0 to current.number_of_children_nodes int size = size_of_B-treecurrent.child[i] ifk = size-1 retu

  • 第k个置换的第i个元素

    您可能无法获得O(n)时间或空间中n个元素的第k个排列的第i个数字,因为代表数字k本身需要O(log(n!))= O(n log n)位,并且对其进行的任何操作都具有相应的时间复杂度。

  • 数组的最小和分区

    你必须解决subset sum问题SumValue = OverallSum 2 请注意,您不需要解决任何优化问题(如max在代码中使用操作所揭示的)。 只需A用可能的总和填充大小为(SumValue + 1)的线性表(1D数组),获得最接近最后一个单元格非零结果(向后扫描A)的wint索引,c

  • 可以在O(n)中将两个排序后的数组合并为第三个数组吗?

    您将保持两个循环,并在将每个“边”的值拉入第三个数组时在每个循环之间进行切换。如果arr1的值小于当前的arr2,则将arr1的值填充到arr3中,直到达到相等或变大,然后翻转过程并开始将值从arr2中拉出。然后只是不断地来回弹跳,直到两个源数组中都没有剩余。 得出O(n + m),又称O(n)。

  • C#使用按位异或进行交换

    谨防。此方法具有非常非常讨厌的属性。它被用于“不受欢迎的C竞赛”参赛作品之一。它会愉快地工作……直到有一天,有人尝试像交换两个数组元素a [i]和a [j]这样的事情而不确保i!= j。 当两个引用都引用同一个变量时,此方法将其清零。

  • Matlab中的简单文本阅读器(OCR)

    灵魂 clear clc %set of patterns BW1 = imread'alphabet.bmp'; patterns = bwlabel~BW1; patternStats = regionpropspatterns,'all'; patternNumber = sizepatternStats; imagePatternArray = cellpatternNumber;

  • BigInteger大多数时间优化的乘法

    jdk8中BigInteger的版本根据输入的大小在天真的算法,Toom-Cook算法和唐津之间进行切换,以实现出色的性能。

  • 扩展二进制搜索算法以查找要在数组中搜索的键值的第一个和最后一个索引

    如果您比较聪明,可以定义两个不同的二进制搜索功能。一个将返回搜索到的值的第一个外观的索引,另一个将返回搜索到的值的最后一个外观的索引。根据对二进制搜索的了解,您应该能够确定比较的最大和最小数目。 我认为,平均而言,使用两个二进制搜索应该是最快的方法。例如,如果仅使用一个二进制搜索来查找第一项,然后线性搜索,则最坏的情况是整个函数的值相同。对于长度为10000的数组,在最坏情况下将给出10013个比较,而对于同一数组,使用两个二进

  • 子集中的五个唯一的随机数

    一个随机号码就足够了。 如果要在1-n范围内选择5个唯一数字的子集,请在1到1之间选择一个随机数(n选择r)。 保持从1到(n选择r)的1-1映射到可能的5个元素子集的集合,就可以了。此映射是标准的,可以在网上找到,例如:http : a href="

  • 反转数组而无需“反转”或复制数组

    使用ES6语法,您不需要将值复制到临时变量中(这是最后一个要求的内容吗?)。 function reversearr { forlet i = 0, j = arr.length-1; i j; i++, j-- [arr[i], arr[j]] = [arr[j], arr[i]]; } const arr = ['a','b','c','d','e'];

  • 动态编程-达到给定分数的不同组合的数量

    您可以通过强制约束每个组合中的元素必须单调递增(即每个元素等于或大于前一个元素)来找到不同的组合。因此,允许(3,3,5),但不允许(3,5,3)和(5,3,3)。要实现此目的,只需将最小值传递给numOfWays,以指示所有剩余值必须等于或大于该值。 int numOfWaysint n, int min{ 计算这种方式的数量: int

  • 我可以将红黑树表示为二叉叶树吗?

    假设您的意思是insert :: a - Tree a - Tree a,那么您的错误可能是由于没有为的子句ins Leaf a。

  • 动态编程总和

    通常的用语是您正在寻找最接近但不超过K的值。如果您的意思是“小于K”,则仅表示您的K值比平时大一个。如果您真正的意思是“不等于K”,那么您基本上会遍历该算法两次,一次找到小于K的最大和,然后再次发现大于K的最小和,然后选择绝对值最大的那个。与K的差异最小。 目前,我将假设您真正的意思是小于或等于K的最大和,因为这是最常见的公式,而其他可能性实际上对算法没有太大影响。 基本想法非常简单,尽管它(至少可能)使用了大

  • 如何找到覆盖有向循环图中所有节点的最短路径?

    编辑:糟糕,误读了问题。感谢@jfclavette接过。老答案在最后。 您要解决的问题称为旅行商问题。有许多潜在的

  • 如何检查是否使用了IEEE 754单精度(32位)浮点表示形式?

    没有简单的测试。 如今,绝大多数系统都将IEEE-754格式用于浮点运算。但是,大多数C实现并不完全符合IEEE 754(与IEC 60559相同),并且没有设置预处理器标识符__STDC_IEC_559__。在没有此标识符的情况下,确定C实现是否符合IEEE 754的唯一方法是以下一项或组合: 阅读其文档。 检

  • 创建受约束的随机数?

    假设您需要[10,30]中的n_1,[20,40]中的n_2,[30,50]中的n_3以及n1 + n2 + n3 = 90 如果您需要每个可能的三元组(n_1,n_2,n_3)都一样,那将很困难。形式(20,n_2,n_3)的三元组的数量大于(10,n_2,n_3)的三元组的数量,因此您不能只是均匀地选择n_1。 极其缓慢但准确的方法是在正确的范围内生成所有5个随机数,如果总和不正确,则拒绝整个组。

  • 快速将字符串与Java中的Collection进行比较

    听起来像BK树可能就是您想要的。这是一篇讨论它们的文章:http : a href="http:blog.notdot.net20074Damn-Cool-Algorit

  • 枚举所有完整(标记)的二叉树

    从注释中可以明显看出,问题在于枚举有根的无序标记全二进制树。正如上文本文,这些树木的编号为n标签是2n-3!!这里!!是双阶乘功能

  • 读取文字的算法或模式

    我认为这个问题将适合于适当的解析器生成器。如果正则表达式出错,则很难对其进行测试和调试。但是,我会选择一个易于使用的解析器生成器,就像它是语言的一部分一样。 对于这些类型的任务,我将使用pyparsing,因为它具有完整的lr解析器的功能,但语法定义困难且辅助函数非常好。该代码也很容易阅读。 from pyparsing import * aaa =""" This is example

  • C:从UTF-8字符串确定UTF-16字符串需要多少字节的最有效方法

    效率始终是速度与尺寸之间的权衡。如果速度优先于大小,那么最有效的方法就是根据源字符串的长度进行猜测。 有4种情况需要考虑,只需将最坏的情况作为最终缓冲区大小即可: U + 0000-U + 007F-在utf8中将编码为1个字节,在utf16中将每个字符编码为2个字节。(1:2 = x2) U + 0080-U + 07FF-编码为2个字节的utf8序列,或每个字符2个

  • 根据随机位流生成随机浮点值

    我认为我永远不会说服您确实需要这个,但是写起来很有趣。 #include stdint.h #include cmath #include cstdio FILE* devurandom; bool geometricint x { returns true with probability min2^-x, 1 if x =

  • 我对空间复杂性的分析正确吗?

    我认为您得到了正确的答案,但原因有误。递归调用的数量与它无关。当您进行递归调用时,它将为堆栈增加一定数量的空间。但是当该调用退出时,将释放堆栈空间。因此,假设您有以下内容: void methodint n { if n == 1 { for int i = 0; i 10000; i++ { method0; }

  • 在将重复项移到末尾时对数组进行排序?

    根据问题的参数,有很多解决方法。 如果不允许使用O(n)外部存储器 ,则一种选择是使用标准排序算法在O(n log n)时间内就地对数组进行排序,然后对其进行第二次遍历将重复项移到末尾(按照您的建议)。您上面发布的代码需要O(n 2)时间,但是我认为可以使用稍微复杂一些的算法在O(n log n)时间内完成此步骤。这个想法分两个步骤进行。第一步,在O(n log n)时间

  • 给定n个盒子和x个球,找到组合

    基本上,您将必须将所有具有所有可能颜色的框组合在一起。在每个新行中,一个框将获取分配给上一行中的下一个颜色。如果您编写了所有可能的方框颜色组合并编写了所有索引,它将变得更加清晰。 PointA 是一个完美的例子: 对于输入 {box1=[blue, red, orange]} {box2=[blue, red, orange]} {box3=[