2022微软苏州Software Engineer校招暑期实习生二面

写在前面

本人应聘的是Software Engineer岗位,更擅长的是前端。但是微软招聘大多考的是算法,今天面试的时候一道前端的题目都没问到emmm…一面也是(详见2022微软苏州Software Engineer校招暑期实习生一面

最后结果是凉凉,还是没有做好非常充分的准备吧。于是自己重新整理了一下解答的思路,整理成这篇文章供大家参考。自己原本答的就不写上来了…(感觉有点丢人现眼…


问答

面试官先就着我自我介绍的内容简单问了一些问题:为什么想学React、学React的时候是否有过牢固的前端基础等等,接下来就是技术性的问题了。

你做的五子棋后端的数据结构是怎么设计的?

这问题属实把我问懵了。我一开始一直想的是数组、堆栈、链表这些数据结构,但是感觉可以说的又很少很少。面试结束后我问了学长,这种题大概应该从数据库表的设计开始讲,做一些实体类的划分,然后根据数据库表的每个字段去建实体类;然后数据层通过接口层可以装到中间数据结构,这时可能会用到一些列表之类的。

不过我做的五子棋项目并没有用到数据库…我觉得这样的话可能就是把建了哪些类、类中的方法、类与类之间的关系说一下吧。不过我的五子棋项目类与类间的关系可能就只有关联关系…emmm…

我的五子棋项目建了几个类,主要有棋盘类、房间类、信息类、WebSocket类(负责接收前端传来的消息)。在WebSocket类中建了2个哈希表,存储的是socket的映射和房间的映射。有用户加入时就将其socket放入socket哈希表中,并根据房间的哈希表建立房间或加入房间,每个房间都对应了一个棋盘。当接收到前端发送的落子消息时,会根据socket的哈希表将该落子消息转发给其他用户,落子消息也会传入棋盘类,由棋盘类判断当前是否有胜方或者负方。棋盘是一个二维数组,每接收一次落子信息,就更新二维数组的值。判断胜负时采用的是向当前落子的周围8个方向循环遍历5次的方法。

你知道有哪些面向对象的设计模式?

工厂模式、桥梁模式、策略模式、观察者模式、适配器模式、装饰器模式、代理模式

如果需求改成连成6个子才算胜利,你会怎么修改?

面试官首先问我判断胜负的方法写在哪个类里面,我说写在棋盘类;他又问,如果要避免棋盘类发生很大改动,需求变成连成6个子才算胜利,应该怎么改?

这里考的应该是面向对象的知识。

可以让棋盘类继承自一个抽象的裁决类,这个抽象的裁决类定义一个判断胜负的方法judge()。judge内会调用一个循环查找的临界值continuousNum变量 ,也就是向该落子的周围8个方向循环查找的次数,以判断在周围8个方向是否都有该颜色的棋子,进而判断是否五子连珠取得胜利。continuousNum变量定义在裁决类内。如果需求改成连成6个子才算胜利,即修改裁决类内的continuousNum变量即可。棋盘类会自动继承裁决类内的judge方法和continuousNum变量,就不用在棋盘类内进行修改。

java 抽象类和接口的区别?

  • 抽象类可以提供成员方法的实现细节,而接口中只能存在抽象方法,不包含方法的具体实现;
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
  • 抽象类可以有静态代码块和静态方法,而接口中不能含有静态代码块以及静态方法;
  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

参考链接:Java中抽象类和接口的区别

Coding

求最大二叉搜索子树

Leetcode上没有原题,在CSDN上找到了相应的一些题解,可参考下面这篇文章

数据结构与算法分析笔记与总结(java实现)–二叉树10:最大二叉搜索子树练习题

总结

这次面试官非常和蔼温柔,但是问的问题是真的始料未及。对于课堂学习的一些基础知识,比如面向对象、数据结构、数据库等等还需要再多多回顾,不能小瞧它们的重要性。最后coding的难度真的很大,单单是判断它是否是二叉搜索树就是Leetcode上一道中等难度的题目。哎,还是得好好努力,好好练习呀。

猜你喜欢

转载自blog.csdn.net/weixin_45830447/article/details/123241130
今日推荐