后台开发社招面经--科技公司总结
商汤科技-后台开发工程师
总的来说,第一次面试体验不错,不过估计有一道算法题没做出来被挂了。
一面(30分钟)
1、自我介绍
2、介绍一个负责过最复杂的项目
3、讲述下项目现在的运营情况
4、设计分布式系统的时候最需要care的点5、使用前端组件查询日志如何完成实时的同步
二面(30分钟)
1、Leetcode原题,****,中等题,秒了,但秒的太快,后面面试官上难度了,以后大家做题还是要想一想(假装)
2、**************,没做出来,说了下思路,大概就是使用邻接表表示图,然后做下dfs,遍历所有路径,记录当前路径总长度长度。然后每次移动检查路径长度(代码就写到这儿时间不够被叫停了,还没跑测试)
三面(30分钟)
题目
做一个Router
功能的设计,给一个 Event Class
,包含了Meta
和 Image
两个 Innerclass
,Meta
里面会有参数 catalog
和 description
,Image
里面也有参数,参数可以是 size
和 url
。要求是Router
可以根据不同的参数,把 event
给到不同的服务器。可能的场景:Meta
可能是一本电子书,会根据电子书的meta
数据而发送到不同的服务器,比如 description
里描述 bookSize > 500kb
,event
会转发送到某一个服务器里,book
类别是某一类特别的分类,event
也会转发到另一个服务器里,可能meta
里带有价格信息,也会根据价格信息做一些判断,转发到一个服务器中。而这个功能会期望Event
携带的图片大小不超过200kb
,才能把event
里携带的图片存储到图片服务器中,不然就要先做图片压缩,再拿新的图片url
来存储到图片服务器中。
我的设计思路和实现
定义 Event
类及其内部类 Meta
和 Image
,设计一个 EventService
接口,然后实现 BookService
和 ImageService
,再通过 EventRouter
路由接口根据事件属性进行路由处理,如果有需要图片压缩的话,则使用 ImageProcessingService
进行图片压缩。
public class Event { private Meta meta; private Image image; public static class Meta { private String catalog; private String description; public boolean hasPriceInfo() { Pattern pattern = Pattern.compile("\\d+\\.\\d{2}"); Matcher matcher = pattern.matcher(description); return matcher.find(); } public boolean isBookSizeGreaterThan(int thresholdKB) { Pattern pattern = Pattern.compile("bookSize\\s*>\\s*(\\d+)kb"); Matcher matcher = pattern.matcher(description); if (matcher.find()) { int bookSize = Integer.parseInt(matcher.group(1)); return bookSize > thresholdKB; } return false; } } public static class Image { private String size; private String url; public boolean isSizeGreaterThan(int thresholdKB) { String sizeWithoutKB = size.replace("KB", "").trim(); int sizeInKB = Integer.parseInt(sizeWithoutKB); return sizeInKB > thresholdKB; } } }
public interface EventService { void processEvent(Event event); void otherEvent(Event event); } public class BookService implements EventService { @Override public void processEvent(Event event) {} @Override public void otherEvent(Event event) {} } public class ImageService implements EventService { @Override public void processEvent(Event event) {} @Override public void otherEvent(Event event) {} }
public interface ImageProcessingService { String compressImage(Event.Image image); } public class ImageProcessingServiceImpl implements ImageProcessingService { @Override public String compressImage(Event.Image image) { image = FakeImageProcessor(image); return image.getUrl(); } }
public interface EventRouter { void routeEvent(Event event); } public class EventRouterImpl implements EventRouter { private final EventService bookService; private final EventService imageService; private final ImageProcessingService imageProcessingService; @Override public void routeEvent(Event event) { if ("电子书".equals(event.getMeta().getCatalog())) { if (event.getMeta().isBookSizeGreaterThan(500)) { bookService.processEvent(event); } else { bookService.otherEvent(event); } } else if (event.getMeta().hasPriceInfo()) { bookService.otherEvent(event); } if (event.getImage().isSizeGreaterThan(200)) { String newImageUrl = imageProcessingService.compressImage(event.getImage()); event.getImage().setUrl(newImageUrl); } imageService.processEvent(event); } }
public class EventController { private final EventRouter eventRouter; public void handleEvent(Event event) { eventRouter.routeEvent(event); } }#第一次面试##软件开发##社招#