📜  高盛面试经历| 2019 年 9 月 |有经验的(1)

📅  最后修改于: 2023-12-03 15:29:00.366000             🧑  作者: Mango

高盛面试经历 | 2019 年 9 月 | 有经验的程序员

概述

在 2019 年 9 月,我作为一名有多年编程经验的程序员,参加了高盛的面试。在这次面试中,我经历了几轮笔试和面试过程,以下是我的面试经历以及一些经验总结。

笔试

在面试前的笔试环节,我被要求完成了以下几个编程题目:

1. 二叉搜索树的基础操作

这题要求实现二叉搜索树的增删查操作,并要求对二叉搜索树进行中序遍历,输出排序好的结果。

实现思路

我首先编写了一个 Node 类,用于表示二叉搜索树中的一个节点。在 Node 类中,我定义了以下三个属性:

class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

其中,val 表示节点存储的值,left 和 right 表示节点的左右子节点。在该类中,我实现了以下几个方法:

  • insert(val: int) -> None:插入一个值为 val 的节点。
  • delete(val: int) -> None:删除值为 val 的节点(如果存在)。
  • contains(val: int) -> bool:判断是否存在值为 val 的节点。
  • inorder() -> List[int]:对二叉搜索树进行中序遍历,返回排序好的结果。

然后,我编写了一个 BST 类,用于表示整个二叉搜索树。在该类中,我定义了以下两个属性:

class BST:
    def __init__(self):
        self.root = None
        self.size = 0

其中,root 表示二叉搜索树的根节点,size 表示二叉搜索树中节点的个数。在该类中,我实现了以下几个方法:

  • insert(val: int) -> None:向二叉搜索树中插入一个值为 val 的节点。
  • delete(val: int) -> None:从二叉搜索树中删除值为 val 的节点(如果存在)。
  • contains(val: int) -> bool:判断二叉搜索树中是否存在值为 val 的节点。
  • inorder() -> List[int]:对二叉搜索树进行中序遍历,返回排序好的结果。

这里涉及的二叉搜索树的知识点我在此不再介绍,有需要的读者可以参考其他资料。

2. 最大子段和

这道题要求在一个整数列表中找到一个连续的子列表,使得该子列表的和最大,并返回其和。

实现思路

这道题可以用动态规划来解决。具体来说,假设 $a$ 是我们要求解的整数列表,$dp[i]$ 表示以 $a[i]$ 结尾的最大子段和,$ans$ 表示最终的最大子段和。因此,我们可以得到以下递推式:

$$ dp[i] = \max(dp[i - 1] + a[i], a[i]) \ ans = \max(ans, dp[i]) $$

最终,$ans$ 就是所求的最大子段和。

3. 到达某个点的移动次数

这道题给出了一个 $N \times M$ 的矩阵,每个位置上都有一个数字。你从左上角出发,每次可以向右或者向下走一步,直到到达右下角。你需要最小化路径上数字的和,并返回该最小和。

实现思路

这道题可以用动态规划来解决。具体来说,假设 $a[i][j]$ 表示矩阵中第 $i$ 行第 $j$ 列的数字,$dp[i][j]$ 表示从起点到达 $(i, j)$ 的最小移动次数。因此,我们可以得到以下递推式:

$$ dp[i][j] = \min(dp[i - 1][j], dp[i][j - 1]) + a[i][j] $$

最终,$dp[N - 1][M - 1]$ 就是所求的最小和。

面试

在面试环节中,我遇到了以下几个问题:

1. 请介绍一下你最熟悉的编程语言

我选择了 Python 作为我的答案,并简单介绍了 Python 的一些特性和用途。

2. 请介绍一下你最近在学习的编程语言或者框架

我介绍了我最近在学习的机器学习框架 TensorFlow,并简单介绍了 TensorFlow 的一些特性和用途。

3. 请设计一个多线程并发访问队列的程序

我按照面试官的要求,使用 Python 的队列模块以及 threading 模块,实现了一个简单的多线程并发访问队列的程序,并考虑了线程安全的问题。

4. 请设计一个 Web 服务,接收客户端提交的数据并存储到数据库中

我使用 Flask 框架,搭建了一个简单的 Web 服务,并使用 SQLAlchemy,将客户端提交的数据存储到了 MySQL 数据库中。

总结

通过这次面试经历,我学到了很多关于编程和面试的知识和经验。以下是一些总结:

  • 做好笔试准备。笔试环节是面试的第一关,我们要对笔试题目进行认真的研究和练习,以便更好地应对面试挑战。
  • 注重编程基础。无论是笔试还是面试,编程基础都是很重要的。我们要不断加强对编程基础知识的学习和掌握。
  • 善于沟通表达。面试不仅要考察我们的编程能力,还要考察我们的沟通和表达能力。我们要注重语言表达能力的培养,并且在面试中能够清晰地表述自己的想法。
  • 保持冷静。在面试中,我们可能会遇到各种各样的问题,有些问题可能会让我们感到无从下手。但是,我们要保持冷静,耐心思考,并试图找到解决问题的方法。