Momenta 高精地图与定位组 一二面面经

背景

985本硕,slam研究方向,无论文,达摩院自动驾驶实习

投递时间

20210815

一面 20210824


电话面试,一共一个小时左右,主要就是过了一边项目,聊天很愉快。面试官是地图定位组的小leader,一直在倾听我的输出。对于项目的问题主要是问技术选型,以及更优的技术方案。之后问了两道slam的基础问题。没有coding。虽然是电话面试但是感觉上还是很nice的

slam基础:

  1. 讲一下熟悉的开源slam框架
  2. 解释基础矩阵和单应矩阵的区别
  3. 介绍一下后端优化中的高斯牛顿方法

二面 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日)通知面试通过,貌似表现比较好所以只有两轮,九月份等待薪资


#面试复盘##面经##Momenta#
全部评论
楼楼拿到offer了吗?我offer审批被卡住了,我在想是不是就凉凉了~~
点赞 回复 分享
发布于 2021-09-28 08:30
tql,这coding 有点难啊
点赞 回复 分享
发布于 2021-09-18 09:56
tql
点赞 回复 分享
发布于 2021-09-10 22:04
你刚开会了吗 好像又说十月谈薪去了 诶
点赞 回复 分享
发布于 2021-09-10 20:05
tql
点赞 回复 分享
发布于 2021-09-10 15:28

相关推荐

评论
6
23
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务