编程面试题

  • Java中的字符串搜索算法

    您可能会发现后缀树很有用(它们在概念上与Tries类似)。 每个字符串都以^开头,以$结尾,并创建所有附加字符串的后缀树。空间使用量将为O(n),可能会比您尝试使用的空间差。 如果现在需要搜索字符串s,则可以在O(| s |)时间内轻松完成,就像trie一样,获得的匹配项将是子字符串匹配项(基本上,您将

  • RSA BadPaddingException:数据必须以零开头

    原则上,代码看起来还可以- 我将进行一些登录以确保所生成的密钥是真正从文件中读取的密钥(您所做的事情并不像使用新密钥生成数据那样愚蠢,然后例如尝试用旧的阅读它?)

  • 俄罗斯农民繁殖

    可以通过添加空格,适当的缩进和适当的函数体来改进它: int peasant_mult int a, int b { for p = 0; p += a 1 * b, a != 1; a = 2, b *= 2; return p;} 看到?现在很清楚如何for使用声明的三个部分。请记住,

  • 如何测试长1000位数的素数?

    如果足以确定一个数字是否为质数,则可以使用内置的isProbablePrime函数 如果调用返回true,则该数字为质数的概率超过(1-1 (2 ^ certainty))。 如果呼叫返回

  • Big O表示法的复杂度顺序是什么?

    大O是要为某些功能的增长找到上限。请参阅Wikipedia上的正式定义http:en.wikipedia.orgwikiBig_O_notation 因此,如果您有一个对大小数组进行排序的算法

  • 提卡距离

    交集大小= 3;(我们如何找到答案?) 的设置位数 p1p2 = 10011 联合的大小= 4,(我们如何找到它?) 的设置位数 p1|p2 = 10111 这里的向量表示二进制数组,其中

  • 使用大型密集2D矩阵快速计算2D子矩阵?

    在算法课程中,我曾经做过一个练习,其中必须稍微扩展Rabin- Karp字符串搜索算法,以您描述的方式搜索匹配的二维子矩阵。 我认为,如果您花时间了解Wikipedia上描述的算法,那么将其扩展为二维的自然方法将很清楚。本质上,您只需对矩阵进行

  • 通过删除最小数量的元素,将给定的整数数组转换为排序的整数

    我相信,这只是 最长的子序列问题不断增长 的巧妙掩饰 。 如果删除具有排序顺序的元素的最少数量,那么剩下的就是原始数组中最长的递增子序列。因此,您可以执行以下操作: 找到最长

  • 将递归置换生成器转换为迭代

    您遇到的挑战是您已经混合了函数调用和循环结构。很难解开这些。 首先,让我们以递归替换所有对流操作的控制。 You'll want to start with getPermutionsRv, n, 0, 0 void getPermutationsRint v[], int n, int i, int j { if i == n { Dis

  • 查找大小为k的子集,以使值之间的最小距离最大

    基数应为: dp[i][1] = INFINITY for i = 1 to n 原因是空集的最小值是正无穷大。 在实践中,任何整数大于最大的可能更大a[i] - a[j]一些co

  • 在随机集中找到最接近的数字

    如果set是有序的,请执行二进制搜索以找到最接近的值(或2个值)。然后通过减去…来区分2中最接近的那个? 如果没有对set进行排序,则只需遍历set(对它本身进行一次以上排序),然后对于每个成员,检查差异是否小于到目前为止所看到的最小差异,以及是否小于是,将其记录为新的最小差异,并将该数字记录为新的候选答案。。 public int FindClosestint targetVal, in

  • 算法-未排序数组中删除的时间复杂度

    查找具有给定值的元素是线性的。 由于数组仍未排序,因此您可以在固定时间内自行删除。首先将要删除的元素交换到数组的末尾,然后将数组大小减小一个元素。

  • 数组中给定数字的最小窗口

    一个遍历列表的简单解决方案。 具有左右指针,最初都为零 向前移动右指针,直到[L..R]包含所有元素(如果右到达末尾,则退出)。 向前移动左指针,直到[L..R]不包含所有元素。查看[L-1..R]是否短于当前的最佳水平。 这显然是线性时间。您只需要跟踪子数组中B的每个元素有多少即可,以检查子数组是否是潜在的解决方案。

  • 牛顿法求浮点数除法的倒数

    要正确设置符号位,请对原始除数和除数的符号执行XOR。 现在使除数和股息的符号为正。 首先将股息指数设置为等于aspx_exponent-1-divisor_exponent-1 +127。+127用于偏差,因为我们只是将其减去了。这将以与除数相同的数量来缩放股息。 将除数指数更改为126(有偏)

  • 从多个值列表中查找所有无冲突的值组合

    这是自生成代码和蛮力在简单性和性能方面击败大多数算法的情况之一。在先前的答案中,我已经看到了很多递归,数组操作和计算,而实际上您想要做的是: foreach $array[0] as $k0 = $v0 { foreach $array[1] as $k1 = $v1 { if $k1 == $k0 { conti

  • O(m + n)和O(mn)之间的区别?

    我对发现直觉的建议是思想实验,如下所示: 首先,认识到m和n是 输入的 两个 不同度量 。它们可能是两个输入流的长度,矩阵边的长度,或同一数据结构的两个不同属性的计数,例如同一图形的边和节点计数,或任何类似的度量。 直觉是big-O用一个简单的函数-称R(m,n)-乘以某个值来表示算法的 真实 运行时间(或其他方面,例如比较计数或所需

  • 匈牙利算法和多因素

    这是一个计划优化问题,所以关键问题是“您要最大化数量”吗?我想您会根据每个志愿者的时间表限制,在不冲突的情况下最大化所有志愿者的总工作时间。您还提到优先考虑具有更多经验的志愿者,因此听起来您在说“有些志愿者比其他志愿者更受 青睐 ”。 这就是经典的二分匹配问题。参见Steve

  • 查找多集的所有子集

    不,您不需要搜索所有可能的替代方法。一个简单的递归算法(如@recursive给出的算法)将为您提供答案。如果您正在寻找一个实际上输出所有组合而不是仅仅输出所有组合的函数,那么这里是用R编写的版本。我不知道您使用的是哪种语言,但是翻译它应该非常简单R擅长于这种事情,尽管代码可能会更长一些。 allCombos-functionlen, ## number of items to sample

  • 带有验证的唯一CD-KEY生成算法

    创建字符串providername000001,providername000002等等或任何并将其与公共密钥加密,这就是你的“CD- KEY”的用户输入。使用私钥对CD-KEY进行解密,并验证解密后您会获得带有有效提供者名称的有效字符串。

  • 从可变权重随机生成组合

    我们必须拥有sum_i P_i = k,否则我们将无法成功。 如前所述,这个问题有些容易,但是您可能不喜欢这个答案,因为它“不够随机”。 Sample a uniform random permutation Perm on the integers [0, n Sample X uniformly at random from [0, 1 For i in Per

  • PHP / MySQL-“最高评分”算法

    这是另一种在统计上听起来不错的好方法:http : www.thebroth.comblog118b

  • 最大产品前缀字符串

    这是基于后缀数组的O(n log n)版本。后缀数组有O(n)个构造算法,我只是没有耐心对它们进行编码。 输出示例(此输出不是O(n),但这只是为了表明我们确实可以计算所有分数): 4*1 a 3*3 aba 2*5 ababa 1*7 abababa 3*2 ab 2*4 abab 1*6 ababab 基本上,您必须反转字符串,并计算后缀数组(SA)和最

  • 目前最佳的垃圾邮件过滤器算法

    研究监督学习技术是一件好事。多项研究表明,将多项朴素贝叶斯分类器用于垃圾邮件过滤非常成功。如果它适用于垃圾邮件过滤,则应使用SMS过滤。您需要的是一个庞大的示例垃圾短信文本数据集,并使用它来训练分类器。 同样,研究支持向量机可能会有所帮助;尽管在垃圾邮件过滤中使用较少;是一种更强大的技术。 另外,仅对原始文本进行算法训练可能不是最好的方法。Mehran Sahami于1998年进行的一项研究发现,当他们

  • Python:Rabin-Karp算法哈希

    这是您的代码的有效版本: def Rabin_Karp_Matchertext, pattern, d, q: n = lentext m = lenpattern h = powd,m-1%q p = 0 t = 0 result = [] for i in rangem: # preprocessing p = d*

  • 使用合并排序的字符串排序

    与@orangeoctopus一样,n对大小字符串的集合使用标准排名算法n将导致On^2 * logn计算。 然而-注意,你 可以 做到这一点的On^2,对变异基数排序。

  • 如何在不同的照明条件下检测颜色

    这是一个非常棘手的问题,并且今天仍在努力解决。其要旨是使用具有代表性的图像基本颜色集来找到颜色量化,该基本颜色可以抵抗不同的外部刺激,例如照明,阴影,不良照明等。 不幸的是,我无法建议任何一种算法在所有情况下都能为您完成工作。但是,过去对我有用的一种算法是在进行图像检索时。具体来说,柯达研究实验室的罗洁波和

  • 使用二进制索引树进行RMQ扩展

    从一点点摆弄的水平来看,这就是我们所拥有的: g用于整数数据数组的普通BIT数组a存储范围和。 g[k] = sum{ i = Dk + 1 .. k } a[i] 其中,Dk仅仅是k具有最低阶1位设置为0。下面我们就来代替

  • 找到2个相等的总和子序列,且总和最大?

    第二种方法的想法是正确的,基本上可以简化背包问题。但是,您的代码似乎缺乏 明确的约定 :该recurse函数应该做什么。 这里是我的建议:int recurseint idx, int sum在岗位分配要

  • 一个圆圈可以包装多少个正方形?

    很抱歉写这么长的答案。我的方法是从理论最大值和保证最小值开始。解决问题时,可以使用这些值来确定所使用的算法的质量。如果您能想到一个更好的最小值,那么可以使用该最小值。 我们可以简单地使用圆的面积来定义问题的上限 Upper Limit = floor PI * r pow 2 L * L 其中L是要打包的正方形的宽度或高度,r是要打包正

  • 平滑算法

    在以下块中: forint j=0;jNO_OF_NEIGHBOURS;j++ { a.ati.x=a.ati.x+a.ati+j.x; a.ati.y=a.ati.y+a.ati+j.y; } 对于每个邻

  • 莱文施泰因飞往达默劳-莱文施泰因

    您的问题是在条件中引用字符串中的先前字符。在原始代码中,您具有: ifi 1 j 1 s_i == t_j-1 s_i-1 == t_j{ d[i][j] = Minimumd[i][j], d[i-2][j-2] + cost; } 问题在于值 t_j-1

  • 伪随机的一对一int32-> int32函数

    乘以一个大的奇数,然后将异或乘以另一个。 Bijection:奇数具有2的乘法逆模幂,因此乘以反即可撤消乘法。当然,xor被另一个xor撤消。 基本上,这就是线性同余伪随机数生成器的工作方式。

  • 在“两加两手”扑克评估师上,如何从传递给它的7张纸牌中获得最好的5张纸牌组合?

    (免责声明:我正在开发一款扑克软件,该软件可以进行人工评估等) 您给它7张牌​​,它会吐出一个手当量值。 有几位评估者在这样做,如果我没有记错的话,其中一些评估者每秒计算超过一亿手(!)。这些评估器基本上可以在一个巨大的阵列中进行7次阵列查找,并且只需要几个周期(尽管缓存未命中)即可评估一手牌。我认为14-15百万秒不是最快的速

  • 有什么聪明的方法可以输出n个项目列表,中间有(n-1)个分隔符?

    char *sep = ""; for i = 0; i size; ++i { printf"%s%s", sep, item[i]; sep = ", "; }

  • 如何生成一个完整的数独板?算法错误

    问题在于,在大多数情况下无法使用随机数生成完整的电路板,如果无法找到下一个单元,则必须使用回溯。我曾经写过一个数独游戏,所以这是生成填充板的代码。 这是Cell类。 public class SudokuCell implements Serializable { private int value; private boolean filled; private H

  • 修改Levenshtein距离算法以不计算所有距离

    实现窗口的问题在于处理每行中第一个条目左侧和最后一个条目上方的值。 一种方法是将最初填写的值从1而不是0开始,然后忽略遇到的任何0。您必须从最终答案中减去1。 另一种方法是用高值填充第一个和最后一个左边的条目,以便最小检查永远不会选择它们。这就是我前几天必须实施的方式: public static int levenshteinString s, String t, int

  • 当速度是首要考虑因素时,代表棋盘的最佳数据结构是什么?

    考虑使用位图:两个64位无符号整数,一个用于白色,一个用于黑色。然后,您可以将移动和棋盘位置表示为一个函数,W x B - W x B其中 W , B分别 代表可能的白色和可能的黑色位置的集合。 然后,大多数板位的工作都可以用整数算术完成,这与您获得的速度差不多。

  • 密码哈希是否提供真正独特的结果?

    (注意:您在问的是哈希函数,而不是加密)。 根据定义,它们不可能唯一。他们需要大量的输入并减小其大小。显然,它们不能代表已压缩的所有信息。因此,它们不会提供“真正独特”的结果。p

  • 在Python中生成循环移位/缩小的拉丁方

    对于第一部分,最简洁的方法可能是 a = [1, 2, 3, 4] n = lena [[a[i - j] for i in rangen] for j in rangen] # [[1, 2, 3, 4], [4, 1, 2, 3], [3, 4, 1, 2], [2, 3, 4, 1]] 第二部分 [[a[i - j] for

  • 计算数组元素之间不同的绝对值的数量

    std::find是线性的(O(n))。我将使用排序的关联容器来处理此问题,特别是std :: set。 #include vector #include set using namespace std; int distict_ab