Momenta 高精地图与定位组 一二面面经
背景
985本硕,slam研究方向,无论文,达摩院自动驾驶实习
投递时间
20210815
一面 20210824
电话面试,一共一个小时左右,主要就是过了一边项目,聊天很愉快。面试官是地图定位组的小leader,一直在倾听我的输出。对于项目的问题主要是问技术选型,以及更优的技术方案。之后问了两道slam的基础问题。没有coding。虽然是电话面试但是感觉上还是很nice的
slam基础:
- 讲一下熟悉的开源slam框架
- 解释基础矩阵和单应矩阵的区别
- 介绍一下后端优化中的高斯牛顿方法
二面 20210830
约面试很快,一共一小时二十分钟,电话面试。首先先是二十分钟过了一遍我的项目经历,但主要还是coding面试。
coding面试主要只给了一个整体的代码框架,需要我自己实现.h文件和.cpp文件
Coding
/** * 连连看规则: * M x N 格子内有若干图标; * 点选两个图标,若图标内容相同,且可以通过少于3个弯的折线连接,则消除; * 全部消除或无法再消除时游戏结束 * ref: https://inews.gtimg.com/newsapp_bt/0/11936964480/641 * * Step.1: * 在 link_up_core.h/.cpp 两个文件中实现类的基本构建 * 1. 包含棋盘、图标的数据结构,支持后续对显示图片和比较图标是否相同功能的开发 * 2. 接口包含初始化棋局、响应点击、判断游戏可解性 */ /////////////////////////////////////////////////////////////// // file: link_up_core.h /////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// // file: link_up_core.cpp /////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// // file: test.cpp /////////////////////////////////////////////////////////////// #include "link_up_core.h" int main(int argc, char* argv[]) { LinkUpCore app; app.randomInit(50, 80); if (app.checkClick(Vec2i(3, 10), Vec2i(25, 60))) { std::cout << "Nice click!" << std::endl; } else { std::cout << "Bad click!" << std::endl; } return 0; }
需要自己定义棋盘以及完成整个游戏库的实现
我写的回答
/** * 连连看规则: * M x N 格子内有若干图标; * 点选两个图标,若图标内容相同,且可以通过少于3个弯的折线连接,则消除; * 全部消除或无法再消除时游戏结束 * ref: https://inews.gtimg.com/newsapp_bt/0/11936964480/641 * * Step.1: * 在 link_up_core.h/.cpp 两个文件中实现类的基本构建 * 1. 包含棋盘、图标的数据结构,支持后续对显示图片和比较图标是否相同功能的开发 * 2. 接口包含初始化棋局、响应点击、判断游戏可解性 */ /////////////////////////////////////////////////////////////// // file: link_up_core.h /////////////////////////////////////////////////////////////// #include "opencv2/core.h" class LinkUpCore{ public: // init LinkUpCore(); // 析构 ~LinkUpCore(); // random init void RandomInit(const int m, const int n); // check bool checkClick(const cv::Vec2i& loc_1, const cv::Vec2i& loc_2); void Update(); // judge horizonal and vertical void IsHLinked(const cv::Vec2i& loc_, const cv::Vec2i& loc_2); void IsVLinked(const cv::Vec2i& loc_1, const cv::Vec2i& loc_2); // judge zero connection // zero turn bool IsZeroLinked(const cv::Vec2i& loc_1, const cv::Vec2i& loc_2); // one turn bool IsOneLinked(const cv::Vec2i& loc_1, const cv::Vec2i& loc_2); // two turn bool IsTwoLinked(const cv::Vec2i& loc_1, const cv::Vec2i& loc_2); private: int m_, n_; // empty -1 // type 0 - 100 std::vector<std::vector<int>> table_; // mutex table_mutex // { // lock; // table_; // } // for int "atomic" keep thread safe } /////////////////////////////////////////////////////////////// // file: link_up_core.cpp /////////////////////////////////////////////////////////////// #include "link_up_core.h" using namespace cv; LinkUpCore::LinkUpCore(){ }; LinkUpCore::~LinkUpCore(){ }; void LinkUpCore::RandomInit(const int m, const int n){ // pass std::vector<std::vector<int>> }; bool LinkUpCore::checkClick(const Vec2i& loc_1, const& Vec2i loc_2){ }; bool LinkUpCore::IsZeroLinked(const cv::Vec2i& loc_1, const cv::Vec2i& loc_2){ if (IsHLinked(loc_1, loc_2)){ return true; } //&nbs***bsp;relation || if(IsVLinked(loc_1, loc_2)){ return true } return false; } bool LinkUpCore::IsOneLinked(const cv::Vec2i& loc_1, const cv::Vec2i& loc_2){ // find mid point // x1, y2 cv::Vec2i tmp_pt_1(loc_1.x, loc_2.y); // x2, y1 cv::Vec2i tmp_pt_2(loc_2.x, loc_1.y); // loop twice if(IsZeroLinked(tmp_pt_1, loc_1)){ return true; } if(IsZeroLinked(tmp_pt_2, loc_2)){ return true; } return false; } /* travrse two cross * find related */ bool LinkUpCore::IsTwoLinked(const cv::Vec2i& loc_1, const cv::Vec2i& loc_2){ // find cross on loc 1 // Vertically traverse for(size_t i = 0; i < n_; i++) { int tmp_x1 = loc_1.x; int tmp_y1 = i; // same as in loc1 & loc2 if(i == loc_1.y) continue; if(tmp_x1 == loc_2.x && tmp_y1 == loc_2.y) continue; // other point location int tmp_x2 = loc_2.x; int tmp_y2 = tmp_y1; cv::Vec2i tmp_1(tmp_x1, tmp_y1); cv::Vec2i tmp_2(tmp_x2, tmp_y2); // judge three times if(IsZeroLinked(tmp_1, tmp_2) && IsZeroLinked(tmp_1, loc_1), IsZeroLinked(tmp2, loc_2)) { return true; } } // Horizonally traverse return false; } /////////////////////////////////////////////////////////////// // file: test.cpp /////////////////////////////////////////////////////////////// #include "link_up_core.h" int main(int argc, char* argv[]) { LinkUpCore app; app.randomInit(50, 80); if (app.checkClick(Vec2i(3, 10), Vec2i(25, 60))) { std::cout << "Nice click!" << std::endl; } else { std::cout << "Bad click!" << std::endl; } return 0; }
后续
第二天(31日)通知面试通过,貌似表现比较好所以只有两轮,九月份等待薪资