返回

笑谈面试题:遇上了他,八成得败下阵来!

前端

还记得你参加第一次面试时的场景吗?作为一名开发工程师,每逢秋招季,各种面试、笔试铺天盖地。其中就有一些天坑面试题,让人恨不得穿越回昨天。

面试官:“小伙子,我们公司就有一个不错的岗位适合你,只要你答对我的问题,岗位就是你的。”

你:“好,您请说。”

面试官:“你能用一句话证明你自己的智商高于牛吗?”

此时,大概率没人能给出一个比较好的答案。而现实情况就是,在面试中,还确实有很多烧脑面试题。那么,究竟都有哪些让人想绕道走的面试题呢?

首先,我们先来看一个编程面试题。

题:要求写一个函数,输入一个任意长度的字符串,返回字符串中第一个不重复的字符。若没有这样的字符,则返回空字符。例如,输入“hello”,返回“h”;输入“11123”,返回“2”。

乍一看,这道题好像不难,许多人应该都能答上来。但如果面试官再多问一句:“怎么实现这个函数的时间复杂度和空间复杂度最优?”很多人就不知道该怎么回答了。

时间复杂度和空间复杂度最优的解法是使用哈希表。哈希表是一种数据结构,它可以将键值对存储在一起。我们可以将字符串中的每个字符作为键,将字符出现的次数作为值。这样,我们就可以在O(n)的时间内找到第一个不重复的字符。

下面我们来看一个算法题。

题:给定一个数组arr,找出数组中所有不重复的子数组。例如,给定数组[1, 2, 3, 4, 5],则不重复的子数组包括[1], [2], [3], [4], [5], [1, 2], [2, 3], [3, 4], [4, 5], [1, 2, 3], [2, 3, 4], [3, 4, 5], [1, 2, 3, 4], [2, 3, 4, 5], [1, 2, 3, 4, 5]。

这道题的解法有多种,一种方法是使用回溯法。回溯法是一种递归算法,它通过穷举所有的可能情况来寻找问题的解。对于这道题,我们可以从数组的第一个元素开始,选择或不选择这个元素,然后递归地解决剩余的子数组。

还有一种方法是使用动态规划。动态规划是一种自底向上的算法,它通过将问题分解成一系列子问题来解决问题。对于这道题,我们可以定义一个状态dp[i][j],表示从数组的第i个元素到第j个元素的所有不重复的子数组。然后,我们可以使用下面的状态转移方程来计算dp[i][j]:

dp[i][j] = dp[i+1][j] U {arr[i]}

其中,U表示并集。

下面我们来看一个数据结构题。

题:给定一个二叉树,求二叉树中所有节点的路径和。例如,给定二叉树:

        1
      /   \
     2     3
    / \   / \
   4   5 6   7

则二叉树中所有节点的路径和为:15 (1 + 2 + 4 + 8 (2 + 3 + 6 + 7))。

这道题的解法有多种,一种方法是使用递归。我们可以从二叉树的根节点开始,递归地计算左子树和右子树的路径和,然后将这些路径和加到根节点的路径和上。

另一种方法是使用栈。我们可以将二叉树的根节点入栈,然后依次将根节点的左子树和右子树入栈。当栈不为空时,我们取出栈顶的节点,计算该节点的路径和,并将该节点的左子树和右子树入栈。

这些只是众多不常见的面试题中的几个例子。这些面试题往往比较难,但它们也能够考察出面试者的编程能力、算法能力和数据结构能力。因此,如果你想在面试中脱颖而出,就必须做好准备,认真复习这些知识点。