Life of xhu

About

我的"面经" & HOJ_1555

May 11, 2014

  |   #日常   |   #HOJ

今天是母亲节,首先,必须要祝我的妈妈节日快乐!

本来说写一篇关于面试的文章的,却一直拖着,现在三方已经到手,我也来总结一下我的面经吧~

首先我必须要声明我的一个观点

所有不根据简历内容提问的面试官都是耍流氓。

我必须告诉我的学弟学妹们,如果有一个面试官问的问题问的问题,和你的简历完全没有关系,或者他根本就不看你的简历,那么相信我,这家企业你完全没有去的必要。

我不相信面试官这么做是因为看不懂你的简历,他肯定能看懂,他之所以不看,只是以为他们根本不在乎应聘者的专业素养如何,他们需要的,只是一个“写代码的”而已。

比如我面试过一家北京的企业,上来就问我会不会ASP.Net什么的,我的简历上明明白白写着熟悉C/C++、Ruby语言,常用开发环境为Mac/Linux,非得要我口头重复一遍么?面试官刚问这一句,我就已经对这家企业完全失去兴趣了。

不要太看重项目经历,专业知识相当重要

你说你不知道红黑树怎么建立,不知道图的几种最小生成树算法有什么区别,很多时候没关系,一般不搞ACM的人都不会(当然我也不会)。但是你连一个二叉树都写不明白,贪心算法的原理都说不清楚,就别怪面试官怀疑你的那些看起来牛逼轰轰的项目了。

当然,如果你的项目全是课程设计那些东西,这一点当我没说。

你的项目,你一定要懂

那种小组形式的课程设计,大部分由别人写的,你就敲了几行代码的的项目,就不要写到简历上了。

对于一个写到简历上的项目,至少下面几点你需要能毫不迟疑地说出来:

  • 你为什么做这个项目;
  • 这个项目用了什么技术;
  • 通过这个项目你学习了什么技术;
  • 完成这个项目你最终有什么收获。

写的是熟悉,但是不能只是熟悉

因为总结了前人在面试时的惨痛教训,很多人现在不在简历上写精通XX语言了,都写熟悉OO语言,但是,只是熟悉,真的是远远不够的。比如你写了熟悉C/C++、PHP语言,当面试官问你这两个语言有什么区别时,如果你只能答出前者一般用来开发本地应用,后者一般用来开发Web应用这种但凡听说过这两门语言都知道的东西,相信我,你还不如不写。

注意在适当的时候自荐

在技术面试的时候,有时候你觉得你某方面的技能对进入这家企业有帮助,而面试官又没有问到这个技能,你可以用一些方式,把话题转移到你擅长的这个技能上。如果面试官对你已经很满意了,这就属于锦上添花,如果面试过程不是很顺利,那这很可能就是一次翻身的机会。

比如我在面试FreeWheel的时候,算法题答的并不是很好,但是在面试的最后,在面试官没有主动问起的情况下,我主动要求说一下我关于RoR的看法和以及对Ruby语言的理解,因为我事先已经知道这家企业使用的就是RoR。所以,在其他问题回答地不是很好的情况下,能够最终获得FreeWheel的Offer,我觉得和我这段自荐经历是不无关系的。

努力让自己与众不同

不要一提到爱好就是看书唱歌音乐这些东西,如果面试官真的问到了这个,他肯定是想听一些不是那么普通的爱好,这点可能不是很重要,但是却是给面试官留下印象的好机会。

比如我在面试广州一家企业的时候,就提到我的课外爱好还有书法,面试官说现在还有能喜欢书法的孩子,真是很少见了。后面的交流,也是相当愉快的。我不敢说这一点给了我拿到Offer提供了多大的帮助,但是的确对后面的交谈起到了良性的催化作用。

让爱好变成特长

如果你爱好硬笔书法,那么请在所有需要手写的地方把字写好;如果爱好唱歌,那么最好能有拿得出手的获奖经历;如果你真的敢说的你的课外爱好就是编程,那么至少也得有一两个拿得出手的个人项目。

喜欢做能做好是两码事。

~~~~~~~~~~~~我是萌萌的昏割线~~~~~~~~~~~~~

1555(未完成):这道题的意思还是很好理解的,就是先给出一个人员名单,然后有几组针对这些人的投票,每一轮投票之后,如果最多的人的选票超过了一半,则输出这个人名,并结束;如果没有淘汰的人获得的选票数都一样,则输出所有未被淘汰的人的名字;如果不是上面两种情况,则票最少的人淘汰,投票给他们的人,选票按照顺序,在下一轮投给这张选票接下来没有被淘汰的人。

题意看似简单,但是其实有很多有猫腻的临界条件,跑了一下POJ上一个大神给的例子,都能过,但是在HOJ上始终是WA,算了,直接放代码了:

#include <iostream>
#include <cstdio>
#include <string>
#include <memory>
#include <map>
using namespace std;

int main(){
    int n, m, tmp;
    while(scanf("%d", &n) != EOF){
        int vote[1010][25], score[25], max, min;
        string name[25];
        bool flag[25], eql;
        memset(flag, false, sizeof(flag));
        for(int i = 0; i <= n; i++)
            getline(cin, name[i]);
        cin >> m;
        for(int i = 0; i < m; i++){
            vote[i][0] = 1;
            for(int j = 1; j <= n; j++)
                cin >> vote[i][j];
        }
        if(m == 1)
            cout << name[vote[0][1]] << endl;
        else if(m == 2){
            if(vote[0][1] == vote[1][1])
                cout << name[vote[1][1]] << endl;
            else
                cout << name[vote[0][1]] << endl << name[vote[1][1]] << endl;
        }else{
            while(true){
                memset(score, 0, sizeof(score));
                eql = true;
                for(int i = 0; i < m; i++)
                    score[vote[i][vote[i][0]]]++;
                if(n == 1)
                    cout << name[1] << endl;
                else{
                    for(int i = 1; i <= n; i++){
                        if(!flag[i]){
                            tmp = i;
                            break;
                        }
                    }
                    max = min = tmp;
                    for(int i = tmp; i <= n; i++){
                        if(!flag[i]){
                            if(score[i] > score[max]){
                                max = i;
                                eql = false;
                            }else if(score[i] < score[min]){
                                min = i;
                                eql = false;
                            }
                        }
                    }
                }
                if(eql){
                    for(int i = 1; i <= n; i++)
                        if(!flag[i])
                            cout << name[i] << endl;
                    break;
                }else{
                    if(score[max] > m / 2){
                        cout << name[max] << endl;
                        break;
                    }
                }
                for(int i = 1; i <= n; i++){
                    if(score[i] == score[min]){
                        if(!flag[i])
                            flag[i] = true;
                    }
                }
                for(int i = 0; i < m; i++){
                    if(flag[vote[i][vote[i][0]]]){
                        for(int j = vote[i][0]; j <= n; j++){
                            if(!flag[vote[i][j]])
                                vote[i][0] = j;
                        }
                    }
                }
            }
        }
    }
}