您的位置:首页 > 其它

记一次面经

2016-06-22 00:26 246 查看
时间: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 就不算了吧。恩不算了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: