# 一面
上来就是怼项目,各种挑刺儿,关键是确实我还没办法反驳他
我看你还用过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的没回答好,其他的感觉都还可以。。不过自己基础不扎实也是一个重要因素了。
全部评论
(2) 回帖