Morgan Stanley面经

背景

2019年至2021年期间,我在上海eBay工作,周围不少同事都是从摩根斯坦利过来的,总体上看很优秀。加上在极客时间的课程讲师里,就有原来从摩根斯坦利出来的,于是对这个公司产生了浓厚的兴趣,再加上当时我觉得和我金融老本行比较对口,于是找各种渠道内推。
(不过当时心里也有个疑问,他们为什么离开摩根斯坦利来到了eBay?)
机会很快来了,对方HR来电简单了解了一下,我获得了面试机会。

20210408 全英文初面 体验好

初面面试官是一位姓Liang的女生 微笑很具备感染力
她先简单介绍了一下自己,提到了几个关键词:处理 marketing data; daily job;收益曲线 yield curve
面试风格比较朴实,没有java八股文,也没有coding

1. 问工作经历

eBay 和 网易 主要
连连和工行她几乎没有问

2. 互联网技术栈和金融技术栈异同点

我讲了分布式和银行集中式不同
她也总结到,没有单独的技术谁好谁坏,首先需求促生了技术,有了好的技术有能实现以前所想不到的

3. airflow她特别提到

我介绍了背景,和qm比优劣点,以及在eBay的mep readout项目中的应用

4. 特别说起了我的项目中使用的cache,解决了什么问题,带来了怎么样的性能提升
5. 数据库的比较,eBay是no-sql ; 网易是mysql等关系型数据库,ACID原则
6. token是什么情况,我提到多次,我解释了下
7. 我在网易的圈圈项目,技术点:企业余额更新设计介绍

她问,怎么处理和团队同事,bu的意见不同
我回答看情况,举例,bu对的,我对的
和团队同事主要在初期,我新去项目还不熟悉,同事指出问题我很乐意;同事熟悉后,也要能为别的同事贡献意见

开发和pm,哪个更喜欢:我回答coding is my passion;pm也有研究,那是为了更好和其沟通

问她:工作中挑战
业务方面,她在考CFA(很上进啊)
技术方面,吸收互联网的技术,开源的,很挑战,老板要求高

通过交流,我心中暗暗总结出来了鄙视链
工行人才凋敝,被阿里吸血
金融业人才凋敝,被互联网人才吸血
外资人才凋敝,被内资互联网人才吸血
(注:以上是2021的情况,然后2022的情况又不同了)


二面

面试官No.1 主要是技术基础部分

姓Cong,年纪较大。一上来就问,如果面试官是我,我怎么面试候选人, 我回答:3个sector,一是项目,二是java基础,三是coding部分
还让我提供了5个java问题:

  1. 线程状态变迁图
  2. hashmap
  3. jmm 为什么volatile起作用
  4. Arraylist
  5. Java新语言特性(其实我也没怎么看这块,他显然也没有)
    让我画企业余额更新的图示(我用了processon),然后追问了b+树结构
    根据如下,他让我代码,写状态
        List<String> list = new ArrayList<>();
        for (int i=0; i<list.size(); i++) {
            System.out.println(""+ list.get(i));
        }
        list.forEach((x)->{
            System.out.println("");
        });
        //lock
        ReentrantLock lock = new ReentrantLock();
        double maxPrice = 0;
        List<Double> prices = new ArrayList<>();
        List<PriceSource> srcs = new ArrayList<>();
        List<Thread> ts = new ArrayList<>();
        for (int i=0; i<10; i++) {
            ts.add(new Thread((src) -> {
                double ret = src.getPrice();
                try {
                    lock.lock();
                    prices.add(ret);
                } catch (InterruptedException e) {
                } finally {
                    if (lock.isLocked()) {
                        lock.unlock();
                    }
                }
            }));
        }
        //run
        for (Thread t : fs) {
            t.run();
            t.join();
        }
        //compare and set max
        if (prices.size() >= 10) {
            for (Double p : prices) {
                if (p > maxPrice) maxPrice = p;
            }
        }
        System.out.println(maxPrice);

问他, 他回答目前在做并发的事情,他让我coding的就是项目写照,怎么低延时是要好好考虑的

面试官No.2 主要是编码部分

自我介绍,英文名Jerry,先问我项目经历,我刚开始说的很多,发现时间紧,就赶紧结束
然后赶紧开始做题目:

新语言,这个expression作用是distinct
其中find最耗费时间,我开始写On平方的算法,
在提示下,对y进行map,简化成On,空间换时间

x = 0 1 2 itself
x = a b c
0 1 2 = 0 1 2 so it is 1 1 1 itself
if x is aaa return 000; so 0 1 2 => 1 0 0 return a
equals O(n)
count O(n)
interval On
find O(n sqart)
compress O(n)

class Solution {
    /* @param: y : place to find ; x : x length = result length ri means the pos in y that xi first ocurr
    **/
    public List<Character> find(List<Character> y, List<Character> x) {
        //check param 1. null 2. length 
        if (y == null || x == null) return null;
        //find ocurr
        List<Integer> ret = new ArrayList<>(x.size());
        Arrays.fill(ret, -1);  
        //optimize: hashmap to imporve 
        Map<Character, Integer> map = new HashMap<>();
        //O(n) for all senario : pre-treat y to map
        for (int i=0; i<y.size(); i++) {
            char c = y.get(i);
            if (!map.containsKey(c)) {
                map.put(c, i);
            }
        }
        //x 
        for (int i=0; i<x.size(); i++) {
            char c = x.get(i);
            if (map.containsKey(c) {
                ret.set(i, map.get(c));
            }
        }
        for (int i=0; i<x.size(); i++) {
            char c = x.get(i);
            if (map.containsKey(c)) {
                ret.set(i, map.get(c));
                continue;
            }
            for (int j=0; j<y.size(); j++) {
                if (y.get(j) == c){
                    map.put(c, j);
                     ret.set(i, j);
                     break;
                }
            }
        }
        return ret;
    }
}

面试官No.3 主要是系统设计部分

面试官介绍自己姓Zhang,然后开始系统设计面试,一旦这个层级,设计的,用英语还是比较难表达的,比编码难,编码毕竟代码是一样的

如下,设计一个股票交易系统:

1. group design stock exchange system ; pair
2. requirement

workable
core function: buy & sell stocks

3. breakdown(miniset)

list stocks
user managerment: user register & unregister
account managment: balance of user, deposit fund, withdraw fund
buy stocks
sell stocks
matching engine

4. user case

list stocks

5. buy stocks

source of price data
input of user (buying price he set up)
call matching engine

6. sell stocks

validation
source of price data
set up sell price
matching

7. data models

user info:
account info(stock balance, money balance):

order info(atomic):
id :
type:
userId:
stock code:
amount (stock):
currencyType: RMB
currencyAmount:
status:

execution info:

8. match strategy

simple match, same price

map to store each stock’s orders; list to orders

//we got all the active orders
List<Order> list = this.getAllActiveOrders();
Map<StockCode, List<Order>> map = new ArrayList<>();
for (Order order : list) {
    if (map.containsKey(order.code)) {
        map.get(order.code).add(order);
    } else {
        map.put(order.code, Lists.of(order))
    }
}
//match
Order buyOrder = getCurrentBuyOrder();
StockCode code = buyOrder.code;
if (map.containsKey(code)) {
    List<Order> allList = map.get(code);
    for (Order aOrder : allList) {
        if (aOrder.type == "SELL" && aOrder.price == buyOrder.price) {
            //transactional atomic
            Account a = this.getAccountById(buyOrder.userId);
            Account b = this.getAccountById(aOrder.userId);
            int min = Math.min(buyOrder.amount, aOrder.amount);
            a.stockAmount += min;
            b.stockAmount -= min;
            a.moneyAmount -= min * buyOrder.price; //precheck enough money
             b.moneyAmount += min * buyOrder.price;;
        }
    }
}

设计讨论之后,他对我从业经历非常感兴趣,特别是当初为什么从体制内的工行出来,我答复:

  1. 技术落后(注:指几年前当时的情况,现在国有银行引入了互联网最新的技术成果,技术栈是有更新的)
  2. 2.期间外派去国外学习了但回来发现无用武之地

后续

面试后,摩根斯坦利hr很快来电话,二面3轮面试都通过了。来了解了我在eBay的薪酬。也介绍了下摩根斯坦利的薪酬,他们没有股票,也没有13薪和年终,只有12薪(和渣打的有点像)。公积金之类都是顶格交的,然后有个saving plan,拿出8%的工资,免税,到离职时一次性拿。所以是按总包算,大概可以给到50-60w(2021年当时情况,在金融业里同岗位横向比还不错的)。如果我同意继续,接下来可能还有一轮到两轮面试(至多不超过2轮,应该是manager的面试了)。
后来我去新加坡Shopee了,没有继续。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Stanley算法也被称为Stanley-Stembridge算法,主要用于计算可逆写作有限生成排列的生长函数。以下是一个基本的Stanley算法的MATLAB程序示例: ```matlab function sf = stanley(n) % 输入一个正整数n,计算Stanley算法的生长函数 sf = sym(zeros(1,n)); % 创建一个符号变量数组来存储生长函数的值 % 初始化第一个排列(1) p = 1; % 对于每个排列长度m从1到n-1 for m = 1:n-1 % 计算长度为m的排列的生成标志函数 gf = genFlag(p, m); % 计算长度为m的排列的生成多项式 gm = sum(gf); % 更新生长函数数组 sf(m+1) = gm; % 生成下一个长度为m+1的排列 p = nextPerm(p, m); end % 打印生长函数数组 disp(sf); end function gf = genFlag(p, m) % 输入一个排列p和排列的长度m,计算排列的生成标志函数 n = length(p); gf = sym(ones(1,m)); for i = 1:m for j = 1:m if p(i) < p(j) gf(i) = gf(i) * (n - j + 1); end end end end function np = nextPerm(p, m) % 输入一个排列p和排列的长度m,生成下一个长度为m+1的排列 n = length(p); np = [p, m+1]; indexes = 1:n; for i = 1:m indexes(p(i)) = []; end np = [np, indexes]; end ``` 在此程序中,我们首先定义了一个函数`stanley`,其中处理Stanley算法的主要步骤。我们创建一个符号变量数组`sf`来存储生长函数的值,并初始化第一个排列[1]。然后,我们使用一个循环来计算每个长度为m的排列的生成多项式,并将其存储在生长函数数组中。最后,我们输出生长函数数组。 我们还定义了两个辅助函数`genFlag`和`nextPerm`。`genFlag`函数用于计算排列的生成标志函数,`nextPerm`函数用于生成下一个长度为m+1的排列。 请注意,这只是一个基本的Stanley算法程序示例,可能需要根据具体应用进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值