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日)通知面试通过,貌似表现比较好所以只有两轮,九月份等待薪资
查看25道真题和解析