【面试】理想汽车 感知算法一面凉经
# 一面
上来就是怼项目,各种挑刺儿,关键是确实我还没办法反驳他
我看你还用过kd-tree,你说一下kd-tree的原理吧,
>简单说了一下,不太满意
你说一下kd-tree怎么查询K近邻的吧
>不会
dbscan的原理你了解吗?
>“内心,冷笑一声,这个老子都快会背了”,balabala。。。,感觉这个人还在装傻,想把我往坑里引
你这个平面分割的假设性很强啊,遇到 case1,case2,。。。你怎么处理
>挣扎了一下。。。
C++基础
float& get_num(){
float num = 10;
return num;
} 这个代码有什么问题? >野指针(后面我查了一下,这种应该算“垂悬指针”)
能编译过吗?
>能,运行会报错
运行会报什么错误?
>指针访问一个未定义的内存
为什么?
>因为num是一个栈上的变量,会在作用域结束的时候释放掉,而返回值却是该内存的地址,这样就会出现指针访问了一个不该访问内存的问题
这样回答他好像还不满意,我又说好像是左值和右值的问题,num马上就要死掉了,所以不能返回地址,要想修改的话,可以返回一个右值引用(因为右值本质上就是为了增加变量的生存周期的),改正如下:
float&& get_num(){
float num = 10;
return num;
} 这样修改完以后,直接报语法错误了,尴尬,。。。 当时就有点傻了,其实正确的修改方式应该是使用std::move()将num变为右值,也就是下面这样:
float&& get_num(){
float num = 10;
return std::move(num); 感觉对于算法岗来讲,这种问题,也算回答的差不多了吧。。。 他的解释:
作用域你了解吗?知道怎么回事吗?,然后后面balabala,
>。。。这个问题被问到,很无语
也没解释出什么来,。。。
关于这道题,有比较好的解释的同学请下方指教~
代码:
z字形打印二叉树
>先用广度优先+vector做的
能不能用栈做?
>试了一下,在提醒下也做出来了
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int a):val(a), left(nullptr), right(nullptr){;}
};
void test(TreeNode* root){
queue<TreeNode*> q;
q.push(root);
int reve = false;
while(!q.empty()){
vector<int > vec;
int len = q.size();
// int
while(len-->0){
auto node = q.front();
q.pop();
vec.push_back(node->val);
if(node->left){
q.push(node->left);
}
if(node->right){
q.push(node->right);
}
}
if(reve){
reverse(vec.begin(), vec.end());
reve = !reve;
}
for(const auto& ele:vec){
cout << ele << " ";
}
cout << endl;
}
};
// 双栈
void test2(TreeNode* root){
stack<TreeNode*> s1;
stack<TreeNode*> s2;
s1.push(root);
while(!s1.empty() || !s2.empty()){
while(!s1.empty()){
auto node = s1.top();
s1.pop();
cout << node->val << " ";
if(node->left!=nullptr){
s2.push(node->left);
}
if(node->right!=nullptr){
s2.push(node->right);
}
}
while(!s2.empty()){
auto node = s2.top();
s2.pop();
cout << node->val << " ";
if(node->right!=nullptr){
s1.push(node->right);
}
if(node->left!=nullptr){
s1.push(node->left);
}
}
}
} 反问:
给点建议?
>做事要深入,不能只会调库,简历上的都要熟悉
总结:
面试官很狡猾,一直把我往坑里引,巴不得我死😅,除了一个kd-tree的没回答好,其他的感觉都还可以。。不过自己基础不扎实也是一个重要因素了。
