📜  常见算法面试问题套装1

📅  最后修改于: 2021-04-26 08:09:22             🧑  作者: Mango

什么是算法?
非正式地,算法是任何定义明确的计算过程,其将某个值或一组值作为输入,并产生某个值或一组值作为输出。因此,算法是将输入转换为输出的一系列计算步骤。 (来源:CLRS算法入门第三版)

二分搜索的时间复杂度是多少?
二进制搜索的时间复杂度为O(Logn)。有关更多详细信息,请参见二进制搜索。

二进制搜索可以用于链接列表吗?
由于链表中不允许随机访问,因此我们无法在O(1)时间到达中间元素。因此,二进制搜索不适用于链接列表。但是,还有其他方法,例如,请参阅“跳过列表”。

如何找到两个给定的矩形是否重叠?
如果满足以下条件之一,则两个矩形不重叠。
1)一个矩形位于另一个矩形的上边缘上方。
2)一个矩形位于另一矩形的左边缘的左侧。
有关更多详细信息,请参见查找两个矩形是否重叠。

如何找到给定时间的时针和分针之间的夹角?
想法是将参考点设为12。找到时针和分针移动的角度,减去两个角度以找到它们之间的角度。有关更多详细信息,请参见时针和分针之间的角度

什么时候发生QuickSort最坏的情况?
在quickSort中,我们选择一个枢轴元素,然后通过将枢轴元素放置在已排序数组中其正确位置的位置来围绕该枢轴元素对给定数组进行分区。
当分区后的一部分包含所有元素而另一部分为空时,将发生quickSort的最坏情况。例如,如果输入数组已排序,并且选择了最后一个元素或第一个元素作为枢轴,则最坏情况发生。有关更多详细信息,请参见http://quiz.geeksforgeeks.org/quick-sort/。

排序后的数组在某个未知点旋转,如何有效地搜索其中的元素。
一种简单的方法是线性搜索,但是我们可以使用二进制搜索在O(Logn)时间中进行搜索。有关更多详细信息,请参见在排序并旋转的数组中搜索元素。
此问题的其他变体,例如在排序和旋转的数组中找到最小元素或最大元素。

由于字符的大字符串,如何高效地找到它的第一个独特的字符?
有效的解决方案是将字符用作计数数组中的索引。遍历给定的字符串并存储每个字符的首次出现索引,还存储出现次数。然后遍历count数组,并找到count为1的最小索引。有关更多详细信息,请参见第一个唯一字符。

如何计算排序数组中的反转?
如果a [i]> a [j]并且i

给定一个大数组,如何有效地在其中找到第k个最大元素?
为此可以有许多解决方案。最好的解决方案是使用最小堆。我们建立前k个元素的Min Heap MH。对于每个元素,在第k个元素之后(arr [k]至arr [n-1]),将其与MH的根进行比较,如果该元素大于根,则使其成为根并为MH调用heapify,否则忽略它。最后,MH具有k个最大元素,而MH的根是第k个最大元素。有关更多详细信息,请参见k个最大(或最小)元素。

给定大小为n的数组,其范围为1到n + 1。该数组不包含任何重复项,缺少一个数字,找到缺少的数字。
有很多解决方法。最好的方法是使用XOR。有关详细信息,请参见查找丢失的号码。此问题有很多变体,例如找到两个重复数字,找到一个缺失和一个重复数字等。

如何编写一种有效的方法来计算x的幂次n?
这个想法是在这里使用分治征服以在O(Logn)时间完成。有关更多详细信息,请参见编写C程序以计算pow(x,n)。

给定一个输入字符串和一个单词词典,请找出输入字符串可以分割为以空格分隔的词典单词序列。
这个想法是使用动态编程。有关更多详细信息,请参见分词问题。

给定n个值v1的硬币行。 。 。 vn,其中n为偶数。我们交替轮流与对手进行比赛。在每个回合中,玩家从该行中选择第一个或最后一个硬币,将其从该行中永久删除,然后接收硬币的价值。确定如果我们先走,我们绝对可以赢得的最大金额。
这也是一个动态编程问题。有关更多详细信息,请参见游戏的最佳策略。

您会获得任意语言中的一组排序单词,您需要查找该语言中的顺序(或字符的优先级)。例如,如果给定的数组为{“ baa”,“ abcd”,“ abca”,“ cab”,“ cad”},则字符顺序为’b’,’d’,’a’,’c’。请注意,单词已排序,并且在给定语言中,“ baa”在“ abcd”之前,因此,“ b”在输出中位于“ a”之前。同样,我们可以找到其他订单。
这可以通过两个步骤来解决:首先通过处理给定的一组单词来创建图,然后对所创建的图进行拓扑排序,有关更多详细信息,请参见此。

你也许也喜欢

  • 常见数据结构面试问题套装1
  • 在各种算法主题上练习测验
  • 最后一分钟笔记– Algo