编程面试题

  • 找到所有从给定集合求和(允许重复)的方法

    如果您愿意花哨的linq技巧,可以发现此C#解决方案很有用。幸运的是,linq读起来有点像英语。想法是k从0开始逐步增加解决方案,直到达到正确的值为止。每个值都k基于先前的解决方案。不过,您必须注意的一件事是确保找到的新“方式”不会对其他方式进行重新排序。我仅通过对它们进行排序就认为它们是有效的来解决该问题。(这只是一个比较) void Main {

  • 多个日期范围比较以进行重叠:如何有效地进行比较?

    查找是否全部重叠 static bool Overlapparams TupleDateTime, DateTime[] ranges { for int i = 0; i ranges.Length; i++ { for int j = i + 1; j ranges.Length; j++ {

  • 如何计算一条线的镜像点?

    假设直线的方程为ax + by + c = 0。现在想象一条垂直于它的线,可以用-bx + ay + d = 0(两条垂直线的斜率乘积为-1)表示。现在的问题是寻找d。将点的坐标放在第二行,您将d轻松获得value 。 第二部分是在第二条线上找到与第一条线等距的第一点。为此,您可以找到两条线的交点。计算的差异x

  • 通过平铺三角形来镶嵌任意多边形

    正如Jason Orendorff指出的那样,您应该尝试使用Triangle生成高质量的网格。它具有许多选项,您可以使用这些选项来尝试获得各向同性的网格。然后,您可以尝试使用迭代算法来创建中心良好的三角剖分。更多详细信息在此出版物页面上列出a href="http:www.cs.uiuc.edu~hiran

  • 替换数据块中的多个模式

    您可以传递一个函数来替换: var hello = "Hello World what a beautiful day"; hello.replaceHello|Worldg, function $0, $1, $2 $3, $4... $n for captures { if $0 == "Hello" return "Bye"; else if $0 ==

  • 在有向图中寻找哈密顿路径的随机算法

    基本上,一旦您对节点的随机选择以一种方式构造了图,使得最后一个顶点A没有未访问的相邻顶点,则需要使一个顶点可用以继续。 为此,请执行以下操作:随机选择一个相邻的顶点,删除其现有的一条边(在哈密顿路径中,任何单个顶点只能有两条边),然后从当前顶点到当前可用的随机选择的一条点绘制一条新边。然后,您从随机选择的顶点跟踪到图形的末尾(第一个只有一个边的顶点),并继续执行算法。 在各种可怕的伪代码中: pr

  • 计算两个列表之间的相似度

    collections.Counter也许使用;从数据类型的角度来看,这些是多集或袋: from collections import Counter counterA = CounterlistA counte

  • 生成所有唯一的Tic Tac Toe板的列表

    由于您需要电路板布局,因此数量很少(19683年)。 您可以通过蛮力生成所有这些。每个盒子只有3种可能性。并且有9个盒子,只需遍历所有盒子。 编辑: int c = 0; while c 262144{ bool valid = c 3 3; valid = c 2 3 &

  • 使用分治法从给定列表中查找第二个最小数字

    请注意,中位数选择算法使用Θ(n)比较,但这并不意味着它最多使用3n 2-2个比较。实际上,我认为它使用的更多,这可能会排除您的解决方案策略。 提示:将这个问题视为对所有2 k进行淘汰赛;每个回合的胜者(两个数字中较小的一个)进入下一轮。要实现这一点需要进行多少次比较?接下来,请注意,第二个最小的数字必须“丢失”到最小的数字。第二小的数字也是“丢失”到最小数字的最小数字。鉴于此,您可以有效地找到第二小的数字吗?br

  • 在不到线性的时间内,找到排序数组中的重复项

    可以使用修改后的二进制搜索在O(log N)中完成: 从数组中间开始:如果array [idx] idx,则重复项在左侧,否则在右侧。冲洗并重复。

  • 查找数目相等的0和1的最大子数组

    这是O(n)时间,O(n)空间算法。我不确定这是否是最佳选择,但它超过了二次时间。 基本思想如下。假设您在每一步中从数组的左侧扫描到右侧的记录,分别是1s和0s之间的差。如果在每个步骤中写出这些值,都会得到如下所示的信息: 1, 0, 1, 0, 0, 0, 0 0, 1, 0, 1, 0, -1, -2, -3 pr

  • Collections.sort()和通过添加到TreeSet中以获得排序后的集合之间的区别?

    区别在于,a TreeSet可以使您始终对数据进行排序,而在上Collections.sort调用时,该方法将对数据进行排序Set。 的时间复杂度Collections.sort是On*logn同时TreeSet的add的复杂性

  • 在python中,如何有效地找到列表中不一定相邻的最大连续数字集?

    这是一个简单的单遍O(n)解决方案: s = [1,4,2,3,5,4,5,6,7,8,1,3,4,5,9,10,11,42] maxrun = -1 rl = {} for x in s: run = rl[x] = rl.getx-1, 0 + 1 print x-run+1, 'to', x if run maxrun: maxend, maxrun =

  • 最大堆二叉树

    我认为可以通过以下过程在O(NlogN)时间内完成。 http:www.cs.rit.edu~rpjc

  • 如何生成两个不同的随机数?

    您可以while循环运行,直到所有数字都不同为止。 All numbers are equal var numberOne = 3; var numberTwo = 3; var numberThree = 3; run this loop until numberOne is different than numberThree do { numberOne

  • 您如何找到这种递归函数的空间复杂性?

    让我们想象一下对f(4)进行评估(您考虑的示例)。这是怎么回事。堆栈从看起来像 I need to compute f4 然后f(4)的计算返回到f(3),堆栈看起来像 I need to compute f4, so I need to compute f3 然后我们继续下降,最终到达

  • 检查列表中的任何项目是否与另一个列表中的任何项目匹配

    您可以编写可处理许多情况的通用扩展方法。该功能本身的实质是一行。 summary Compares both lists to see if any item in the enumerable equals any item in the other enumerable. summary public static bool AnyItem

  • 约瑟夫斯序列

    为了获得被处决者和最后一个幸存者的序列,您只需要从一开始就模拟整个过程。给定过程的描述,这将是非常容易的任务。您提供的公式只是检查谁将生存并快速获得答案的捷径。 有关如何使用范围树在O(n log n)中执行此操作的说明,位于:http : a href="http:pl.scribd.comdoc35

  • 是正六边形内的一个点

    您可以对六边形的每一个边使用方程式。通过它们,您可以确定给定点是否在与六边形中心相同的半平面中。 例如,右上角具有以下等式: -sqrt3x - y + sqrt32 = 0 在此插入点的坐标,然后插入中心的坐标。如果结果具有相同的符号,则该点位于左下半平面(因此它可能在六边形内部)。 然后,使用其他方面的方程式进行重复。

  • 仅使用加法,除法和乘法以固定数量的步长达到数字的算法

    我会使用动态编程。首先,建立一个地图,列出每个步骤可以到达的数字,然后回溯以找出如何到达那里: void CalculateRouteint targetNumber, int numSteps { int maxValue = targetNumber * 16; bool[,] reachable = new bool[numSteps + 1, maxValue]; bu

  • 避免整数乘法后除法溢出

    如果没有更大的类型,则要么需要找到一个大整数样式库,要么使用长乘法手动处理它。 例如,假设a和b是16位。然后,您可以将它们重写为a = 18*aH + aL和,b = 18*bH + bL(其中所有单个组件都是8位数字)。然后,您知道总体结果将是:

  • 有没有一种快速的方法来反转Matlab中的矩阵?

    我实际上需要反函数,所以我不能改用mldivide,… 这是不正确的,因为您仍然可以mldivide用来求逆。注意。在MATLAB中,这等效于A-1 = A-1 * I invA = A\speyesizeA; 在我的机器上,code

  • 匈牙利算法:如何用最少的行覆盖0个元素?

    在Wikipedia文章( Matrix Interpretation 部分)中检查算法的第三步,他们解释了一种计算最小行数以覆盖所有0的方法。 更新: 以下是获取覆盖的最小行数的另一种方法c

  • 有C ++ MinMax Heap实现吗?

    如果您正在寻找算法实现,请尝试搜索Github。

  • 将字符串拆分为最大长度为X的片段-仅在空格处拆分

    使用该textwrap模块(它也会在连字符处断开): import textwrap lines = textwrap.wraptext, width, break_long_words=False 如果您想自己编

  • k均值聚类可以分类吗?

    当然,最简单的方法是2.,将每个对象分配给最接近的质心(从技术上讲,使用平方和,而不是欧几里得距离;这对于k均值更为正确,并节省了sqrt计算)。 方法1.是脆弱的,因为k均值可能会为您提供完全不同的解决方案;特别是如果它在一开始就无法很好地适应您的数据(例如,维数过高,大小不同的集群,集群太多,…) 但是,以下方法可能更加合理: 3.训练实际的分类器。p

  • 查找给定因子数量最小的算法

    http:www.primepuzzles.netproblemsprob_019.htm b)Jud McCranie,TWA Bau

  • 合并分类的空间要求

    有一些可以进行合并排序的版本。 但是,在大多数实现中,空间在数组大小上是线性的。这意味着第一级为n,第二级为n 2,第三级为n 4,依此类推。当您处于递归的底部时,该级数加起来约为2n,这是线性的。

  • 为线性同余生成器选择A,C和M

    从维基百科: 如果 c 不为零,则在且仅在以下情况下,LCG将对所有种子值具有完整的周期: c 和 m 是相对质数, a -1可被 m的 所有素因子整除, a -1是4的倍数,如果 mem

  • Python-压缩Ascii字符串

    使用压缩并不总是会减少字符串的长度! 考虑下面的代码; import zlib import bz2 def comptests: print 'original length:', lens print 'zlib compressed length:', lenzlib.compresss print 'bz2 compressed length:'

  • Laderman的只有23个乘法的3x3矩阵乘法,值得吗?

    计时测试: 我自己进行了时序测试,结果令我惊讶(因此,为什么我首先问这个问题)。简而言之,在标准编译下,它的laderman速度快〜225%,但是在带有-03优化标志的情况下,它的 速度慢了50% !每次在-O3标志期间我都必须向矩阵中添加一个随机元素,否则编译器会 完全优化 简单乘法,并在时钟精

  • 是否有STL算法来查找序列中值的最后一个实例?

    但是现在的问题是,我不能使用begin()和end()来创建“ head”和“ tail”范围,因为它们不是反向迭代器。 reverse_iterator::base是您要寻找的- 在SGI的verse_iter

  • 包含给定节点集的最小连接子图

    我想不出一种能找到最佳解决方案的高效算法,但是假设您的输入图很密集,那么下面的方法可能会很好地起作用: 将输入图转换GV, E为加权图G'N, D,其中N是您要覆盖的顶点的子集,并且D是原始图中相应顶点之间的距离(路径长度)。这会将所有不需要的顶点“折叠”到边中。

  • 在int中找到第n个SET位

    事实证明,确实可以无循环执行此操作。预计算此问题的(至少)8位版本最快。当然,这些表会占用高速缓存空间,但是在几乎所有现代PC方案中,仍然应该有净加速。在此代码中,n = 0返回最低设置位,n = 1倒数第二,以此类推。 __popcnt解决方案 有一个使用__popcnt内在函数的解决方案(您需要__popcnt才能非常快,否则通过简单循环解决方案获得的任何性

  • 程序可以输出自身的副本吗

    是。可以复制自身的程序称为“ quine”。 大多数藜的基本思想是: 你写的代码,需要一个字符串字面量s并打印出来,而更换出现(或 在 发生)的特殊子的 FOO 在s通过价值s本身。 到目前为止,您已获取了该程序的全部源代码,并将其

  • 与手动滚动循环相比,应该使用STL算法吗?

    这取决于: 是否需要高性能 循环的可读性 算法是否复杂 如果循环不是瓶颈,并且算法很简单(例如for_each),那么对于当前的C ++标准,我希望使用手动滚动循环以提高可读性。(逻辑的局部性是关键。) 但是,现在一些主要的编译器支持C 0x C 11,我想说要使用STL算法,因为

  • 百分位数计算

    我认为Wikipedia页面包含您需要编写自己的函数的公式… 我尝试过此操作: public double Percentiledouble[] sequence, double excelPercentile { Array.Sortsequence; int N

  • 在最近的邻居算法中“来自不同的顶点链”是什么意思?

    1)描述中指出,每个顶点总是属于“单个顶点链”(即,它是单独的)或属于另一个链;一个顶点只能属于一个链。该算法说,在每个步骤中,您都选择两个顶点的每个可能对,这两个顶点分别是它们所属的链的端点,并且尚未属于同一链。有时他们会单身。有时其中一个或两个都已经属于非平凡链,因此您将加入两个链。 2)您重复循环 n 次,以便最终选择每个顶点;但是,是的,实际的迭代计数没有任何用。重要的是您要运行循环足够的时间。

  • 关于循环置换

    这是我的猜想的证明。让n是排列的长度,m是窗户的长度,我们可以转动,在那里1 ≤ m ≤ n。排列P和Q是 几乎相等 ,如果存在窗口旋转的序列变换P成Q。几乎相等是等价关系。这是对等价类的要求保护的特征。 co

  • 实现用于检测自相交多边形的蛮力算法

    您当前的蛮力算法为O(n ^ 2)。对于您的两个70,000线多边形,这几乎是100亿次运算的一部分,更不用说其他700,000个多边形了。显然,单凭代码优化就不够了,因此您需要某种算法优化,可以降低O(n ^ 2)而又不会过于复杂。 O(n ^ 2)来自蛮力算法中的嵌套循环,每个循环都以限制n,使其为O(n * n)。改善此问题的最简单方法是找到减少内部循环的方法,以使该内部循