记一次面经
时间:2016年6月21日
面试公司:春雨医生
面试形式:在线面试
经ljl同学的热心推荐,我获得了春雨公司的一次远程面试的机会。正常在一个自觉很尴尬的时期,研一行将结束的时候,每日在学校很无力的感觉。导师没给留下什么具体的任务,本着不要闲着的原则,我还是积极的参加了这次面试。相比于百度,真心觉得能给够真正为面试者考虑而安排面试形式的公司,都是好公司。
一面:技术面。上来聊了下简历。然后http://collabedit.com/9dnwg在线撸代码。环境不表,来说题吧。
First one: 通过“0”来进行交换排序。比如给定: 一个无序含0数列,且保证0是最小元素。输出排序(递增)后的结果。要求:排序过程中只能交换0和其他的元素。 eg: 2 0 4 3 5 ,分析题意,不难想到(hehe 反正我就是楞想出来的 试着试着就撞到了)0是用来交换两个逆序数字的中介。 比如想要交换 4 3 那么先将逆序的较小数字3和 0 交换: 2 3 4 0 5 ,然后再将较大数字与0交换:2 3 0 4 5 ,然后将较小数字3和0交换:2 0 3 4 5,这样就使得逆序对 4 3 有序了。如此反复, 直到有序。
Second: 找出字符串中第一个重复字符出现的第一个位置。 map搞了一下,这个太easy
Third :求最大子序列和。先敲了个o(n^3),然后提示下优化到了O(n)。
一面总结,觉得好简单。一切都挺顺利的,整个面试正好1h。
二面:Manager 技术面。就一道题,有序循环链表的任意位置插入。且插入后仍有序。 题挺简单,但坑多。不知怎的,好紧张。对方气场过强,能够透过电脑传过来?
分分钟敲完,然后manger一次给挑1个bug,3个bug,这感觉真心不爽。
坑1:当p到达结尾时,如果待插入值k>= list[end] 直接插入。
坑2:当p到达结尾时,如果k <= list[head]直接插入。
坑3:当数组元素全部相同时,在我的code中会导致死循环。因为在判断递增关系时候用的是 前值<=后值 但进去之后发现又不满足 >=前 <=后的插入条件。其实这种情况也简单,直接在任意位置插入k就好了。
// // main.cpp // CycleChain // // Created by LiJinxu on 16/6/21. // Copyright © 2016年 LiJinxu-NEU. All rights reserved. // #include <iostream> #include <cstdio> using namespace std; typedef struct Node { Node *next; int value; }*PNode, Node; void create(PNode head) { PNode p = head; int n, t, loop = 0; cin>>n; loop = n; while(loop){ cin>>t; PNode newNode = (PNode) malloc(sizeof(PNode)); newNode->next = NULL; newNode->value = t; if(loop == n){//头结点 head->value = t; head->next = NULL; }else{ p -> next = newNode; p = p -> next; } loop --; } p -> next = head; } void travel(PNode head) { PNode p = head; do{ cout<<p->value<<" "; p = p -> next; }while (p != head); cout<<endl; } void insert(PNode head, int k) { PNode newNode = (PNode)malloc(sizeof(PNode)); newNode -> next = NULL; newNode -> value = k; PNode p = head; while (true) { if(p -> value <= p -> next -> value){//在递增区间上 if(p -> value <= k && p -> next -> value >= k){ PNode tmpNode = p -> next; p -> next = newNode; newNode -> next = tmpNode; break; } } else{//在结尾处 if(p -> value <= k || p -> next -> value >= k){ PNode tmpNode = p -> next; p -> next = newNode; newNode -> next = tmpNode; break; } } p = p -> next; if(p == head){//如果又回到了起点,说明所有元素具有相同的值,那么插在哪里都无所谓了 PNode tmpNode = p -> next; p -> next = newNode; newNode -> next = tmpNode; break; } } } int main(int argc, const char * argv[]) { PNode root = (PNode)malloc(sizeof (PNode)); create(root); int insertVal; cout<<"Please input the insert value: "; cin>>insertVal; insert(root, insertVal); travel(root); return 0; }
三面:HR姐姐谈人生。
面试总结:平时要加强coding熟练度。 快速、准确、非编译测试的情况下coding,解决问题。
完备性:因为是在线写,网站本身不具备编译 运行功能,平时靠跑测试用例的测试方法行不通。那就考验自身算法的完备性了。之前还窃以为 不需要运行 会更简单,其实这么看来,反而相反。对于大神来说,人脑编译是很快的,因为他很清楚算法的边界情况,就很容易抓到你的bug。
时间:提高编程速度。
难度:面试题目应掌握中等以下的难度,太难的题小公司是遇不到的。难题重点掌握思路就好(思路也很难掌握啊 -= )
平时需要继续多多练习,也多多参加一点面试,积累点面经。
最后,不论结果怎么样,anyway, The final boss is my PHD.yang , 这个几率会低到多少呢? 不知道,不是怎么知道?哪怕被喷。╮(╯▽╰)╭
后记:
我目前为止最复杂的一次面试。之前第一次是 睿丰 做iOS的,几乎就是想拉人进去培训,而不是真心想要开发。第二次 Biubiu 就不算了吧。恩不算了。