2023.5.31 小马智行 c++ 一面

小马智行,c++一面小记

导语

  流程大概45分钟。除了基本的问题,除了自我介绍之外,根据我的一个项目问了个问题,然后手撕了两个题。整体来说体验还不错,比较顺畅。

面试内容

   这里只记录重点内容。
   Q1:项目中提到了使用gn来构建跨平台的工程,那么它的原理是什么呢?
   A1:这个可以先从本地IDE做了什么谈起。本地IDE其实是帮助你用图形化的方式去组织了文件的依赖以及包含关系,然后不同的平台,不同的编译器中去执行了不同的指令来完成后续的一个编译,链接的过程。比如在visual studio中它是通过nmake工具完成,比如linux的GNU的make工具完成。
   而这些gn脚本,包括cmake,make等工具,它的本质也是在脚本中去编写文件的依赖关系,然后由它们负责在不同的平台去选择对应的编译工具,去生成对应的工程或者直接使用相应的编译器来帮助你进行构建。 这样就能够达到一个只写编译脚本,不关注运行平台但是运行相应的脚本就能够跨平台地进行构建的功能。

   Q2: 给一个完全二叉树,然后随机删除一个节点,返回删除的这个节点的序号。

int findFirstDeleteNode(TreeNode* root){
    
    
  if(root == nullptr){
    
    
    return 0;
  }
  
  std::queue<TreeNode*> q;
  q.push(root);
  int curIndex = 0;
  while(!q.empty()){
    
    
    TreeNode* currentNode = q.front();
    q.pop();
    if(currentNode == nullptr){
    
    
      return curIndex;
    }
    curIndex++;
    
    q.push(currentNode->left);
    q.push(currentNode->right);
  }
  return -1;
}

   Q3: 给两颗二叉搜索树,然后给一个整数,判断是否能在两个树中找到两个节点的和为该整数。

bool findIfPariedWithTarget(TreeNode* root1, TreeNode* root2, int target){
    
    
	std::unordered_set<int> set1,set2;
  dfs(root1,set1);
  dfs(root2,set2);
  
  for(int val:set1){
    
    
    if(set2.count(target - val)){
    
    
      return true;
    }
  }
  
  return false;
}

void dfs(TreeNode* root, std::unordered_set<int>& s){
    
    
	if(!root) return;
  s.insert(root->val);
  dfs(root->left,s);
  dfs(root->right,s);
} 

猜你喜欢

转载自blog.csdn.net/weixin_41937380/article/details/131035621
今日推荐