C基础 北京大公司面试简单总结

作者有话说

  这是关于程序员面试的一篇文章, 希望对你有帮助. 干了快3年了. 可以简单参考, 对比总结.虽然本人很水.

很喜欢当前做的手游项目.做的很认真.后端每个人技术都很好.但是结果都不如意.在死亡线上挣扎.

目前基本上老大都找小弟们谈谈走的事. 但是我的老大还有老大的老大希望我继续留下来. 哎, 但想出去看看.

简单的自扯一点. 我是2013年退学出来干IT. 当时做window后端相关开发. 后面从事Linux后端开发. 用过

较多语言,技术很一般.

  干了那么久有点明白了, 产品比技术重要......  

那开始说正题吧, 最近1-2周面过的那些名门.帮同事面的就不写了,也比较多.都很相似.

 

面 一个最好的团购部门

  我的同事跳槽进去了,内推我进去. 主要是做高性能Web相关开发.这方面没有项目经验,但面试我的人很热心.

耐心的同我讲解Web框架,流程等. 其中问我一个问题是

/*
 * 1. 怎么判断一个字符串是个合法的ip串.
 */

需要手写.再扯一点, 面的东西太多了就找一个有代表性的面试题吧. 

 主要思路是 以 ip4 为例 *.*.*.* => *.*.*.*\0 以 '.'和\0 分割成4部分处理. 比较基础主要看代码

// 是ip返回 true, 否则返回false
bool 
isipv4(const char* ips) {
    //记录当前计数范围[1, 3], 总的计数范围[7, 15], n记录当前量, 点的个数
    int ncut = 0, scut = 0, n = 0, dcut = 0; 
    char c; // 临时量记录*ips结果
    // 简单判断字符串
    if(!ips || !*ips) return false;
    
    do {
        c = *ips;
        // 非法字符直接返回false
        if((c<'0' || c>'9') && c!='.') return false;
        if(c>='0' && c<='9') {
            n = 10*n + c - '0';
            // 排除>=256 和 00,09的情况
            if((n>255) || (ncut>0&&n<10))
                return false;
        }
        if(c=='.' || !ips[1]){ // *.*.*.*\0 以'.' 和 \0分割
            n = 0; 
            ncut = -1;
            ++dcut;
        }
    } while((*++ips) && (dcut<4) && (++ncut<=3) && (++scut<=15));
    
    return dcut==4 && !*ips && ncut<=3 && scut<=15;
}

当天面试官说语言不限. 我就用C写了个. 当时是下午状态不好.面试的很不好. 数据结构,算法,缓存,linux基本都过了.

关于数据库mysql 方面不行, 被问倒了. 主要问事务,慢查询, 索引优化. explain和mysqldumpslow 等等...

这里三面中聊的最多的是设计. 对当前公司模块的设计, 对未知模块的设计. 例如他问,我们这是个电商, 你怎么设计电商系统等等..

面的都比较实在, 手写的算法题也简单.

最后结果是, 那边经理说,有几个人都差不多再看看.

总结: 状态不好,不情愿千万别去面. 要去面一定要全力以赴.

技术方面:数据结构要可以, 对自己当前公司的架构要深刻了解. 基础知识要牢固. 数据库要好.

完整演示demo, 运行结果也在下面

#include <stdio.h>
#include <stdbool.h>

// 是ip返回 true, 否则返回false
bool isipv4(const char* ips);

/*
 * 1. 怎么判断一个字符串是个合法的ip串.
 */
int main(int argc, char* argv[]) {
    const char* ips;
    
    ips = "192.168.1.34";
    printf("%s => %d\n", ips, isipv4(ips));
    ips = "192.168.1.34.45";
    printf("%s => %d\n", ips, isipv4(ips));
    ips = "192.0.01.34";
    printf("%s => %d\n", ips, isipv4(ips));
    ips = "192.168.1.341";
    printf("%s => %d\n", ips, isipv4(ips));
    ips = "0.77.1.a4";
    printf("%s => %d\n", ips, isipv4(ips));

    return 0;
}

// 是ip返回 true, 否则返回false
bool 
isipv4(const char* ips) {
    //记录当前计数范围[1, 3], 总的计数范围[7, 15], n记录当前量, 点的个数
    int ncut = 0, scut = 0, n = 0, dcut = 0; 
    char c; // 临时量记录*ips结果
    // 简单判断字符串
    if(!ips || !*ips) return false;
    
    do {
        c = *ips;
        // 非法字符直接返回false
        if((c<'0' || c>'9') && c!='.') return false;
        if(c>='0' && c<='9') {
            n = 10*n + c - '0';
            // 排除>=256 和 00,09的情况
            if((n>255) || (ncut>0&&n<10))
                return false;
        }
        if(c=='.' || !ips[1]){ // *.*.*.*\0 以'.' 和 \0分割
            n = 0; 
            ncut = -1;
            ++dcut;
        }
    } while((*++ips) && (dcut<4) && (++ncut<=3) && (++scut<=15));
    
    return dcut==4 && !*ips && ncut<=3 && scut<=15;
}
View Code

 

 

 面 一个最好的手游工作室

  这个面试基本上刷新了我的面试记录. 都5面过了. 对我说你可以的恭喜. 这边还需要总部的一个总监面试一下. 但是等了很久,

联系了第一面那位. 那位让我再等等,估计总监忙.豪门社招真心 让你等到麻木.(但是面的很值, 都是前辈高手)

中间最关键的是二面,他们的技术总监过来了. 问的很随意,先让我手写一个完整的可运行的程序. 求加数和

/*
 * 写一个完整的程序. 
 * 输入一个数c,输出所有 c = a+b的结果
 * 例如 3 = 1 + 2, 不用输出 3 = 2 + 1 和 3 = 1 + 1 + 1
 */

再扯一点,这家公司一面很难. 中途总结: 计算机网络, 数据结构, 实战经验, 操作系统知识不好, 行业经验不足基本上 过不去.

这方面也很赞同, 基础知识决定程序员的地基打的牢不牢固. 不细说了, 还是说这个题吧

#include <stdio.h>
#include <assert.h>

// 打印所有结果
void printsum(int s);

/*
 * 写一个完整的程序. 
 * 输入一个数c,输出所有 c = a+b的结果
 * 例如 3 = 1 + 2, 不用输出 3 = 2 + 1 和 3 = 1 + 1 + 1
 */
int main(int argc, char* argv[]) {
    int s;

    // 输入阶段
    printf("Please input sum(need gt one):");
    if(scanf("%d", &s)!=1 || s<=1){
        fprintf(stderr, "Input s:%d is error!\n", s);
        return -1;
    }

    //输出阶段
    printsum(s);

    return 0;
}

// 打印所有结果
void 
printsum(int s) {
    int i, len;
    // 习惯决定素质, 谦虚就是最好的习惯和最大的装逼
    assert(s>1);
    
    for(i=1, len = s/2; i<=len; ++i)
        printf("%d = %d + %d\n", s, i, s-i);
}

演示结果如下

还有

他看完后. 基本上就过了. 后面就继续聊设计了了. 模块设计, 代码调试了等 后面项目经理面, 技术专家面等. 都好难很深入. 真心觉得,

经验不足,能力不够, 外在不注意那就pass.

总结: 大公司核心部门 讲究的是运气了. 如果不是极其优秀的话. 关键优秀也是靠时间的. 姜还是老的辣.

感悟:像我这样的菜鸟还是需要多向前辈们多学习学习,争取少趟坑.

能和那些干的很久的同行交流,是一件很愉快的事. 朋友们多找机会.

这家公司很注意外在谈吐, 内在基础和聪明程度.

脸黑或实力不是撒亚人超表 我看悬...

 

面 一个低调的端游公司

  这家是北京为数不多的端游公司, 很低调.个人面试的很愉快. 如果实在脸黑. 已经准备加入到这家公司维护和开发更出色游戏项目.

它需要先做笔试题. 快速的花了30min做完了. 就找前台聊了. 聊得最多的是基础和调试还有就是设计. 最后应该是组长给我

定位说你技术可以,就是设计差....... 其中一个面试题如下

/*
 * 写一个函数 "将整数字符串转成整数"
 */

 这家公司 主要问计算机网络 和 pthread线程开发 还有C++基础聊得很多. 要求最高的就是C++基础. 上面题做出来容易. 做好不容易看下面.

/*
 * 将整数字符串转成整数.通过pnum返回
 * istr        : 源字符串
 * pnum        : 返回的整数
 *             : 返回0表示成功, -1表示参数错误, -2表示溢出
 */
int 
convert(const char* istr, int* pnum){
    int num = 0, tmp;
    char c, f = 0; // f == 1表示负数

    // 先检查参数错误
    if(!istr || !*istr || !pnum) return -1;
    // 处理正负号
    if((c=*istr)=='-' || c=='+'){
        f = c == '-';
        ++istr;
    }
    
    // 处理正数部分, !!是为了消除Pelles c的警告
    while(!!(c=*istr++)) {
        // 非法字符直接返回
        if(c<'0' || c>'9') return -1;
        tmp = 10*num + c-'0';
        // 数值越界直接返回结果
        if(num>tmp) return -2;
        num = tmp;
    }
    
    *pnum =  f ? -num : num;
    return 0;
}

很多场景,很多代码.你没躺过坑你是不会晓得行业潜规则的.没有努力和勤奋或者坚持和聪明再或者没有傻劲

你真的做不好. 真的顶不住 , 更别说抗住了. 个人也只是装逼, 也在学习成长....

演示测试代码如下

#include <stdio.h>
#include <stdlib.h>

/*
 * 将整数字符串转成整数.通过pnum返回
 * istr        : 源字符串
 * pnum        : 返回的整数
 *             : 返回0表示成功, -1表示参数错误, -2表示溢出
 */
int convert(const char* istr, int* pnum);

/*
 * 写一个函数 "将整数字符串转成整数"
 */
int main(int argc, char* argv[]) {

    const char* str = "+123456";
    int num;
    int flag = convert(str, &num);
    
    //输出测试结果
    if(flag) 
        fprintf(stderr, "%s is error %d\n", str, flag);
    else
        printf("str:%s => %d\n", str, num);

    return 0;
}

/*
 * 将整数字符串转成整数.通过pnum返回
 * istr        : 源字符串
 * pnum        : 返回的整数
 *             : 返回0表示成功, -1表示参数错误, -2表示溢出
 */
int 
convert(const char* istr, int* pnum){
    int num = 0, tmp;
    char c, f = 0; // f == 1表示负数

    // 先检查参数错误
    if(!istr || !*istr || !pnum) return -1;
    // 处理政府号
    if((c=*istr)=='-' || c=='+'){
        f = c == -1;
        ++istr;
    }
    
    // 处理正数部分, !!是为了消除Pelles c的警告
    while(!!(c=*istr++)) {
        // 非法字符直接返回
        if(c<'0' || c>'9') return -1;
        tmp = 10*num + c-'0';
        // 数值越界直接返回结果
        if(num>tmp) return -2;
        num = tmp;
    }
    
    *pnum =  f ? -num : num;
    return 0;
}
View Code

测试截图

到这里 关于三个面试基本都简单说了. 也许不是干货. 但是是最近亲身经历. 最想表达的是.
做程序员, 多重视基础. 务实沉淀是根本. 不管在那都要认真工作, 踏实处理事情. 

 

后记 

  到最后了.很希望最后是最有意义的. 心灵鸡汤能帮到你. 让你觉得最值.

1. 程序员对工资的看法, 假如你8K, 和你相似的是18k. 在北京一年下来比你多10万, 10年也就是100万. 在北京100万能干什么呢?

  我所想表达的是 (以Dota举例) 程序员不是后期, 需要疯狂打钱, 他是中单带节奏的. 一定要找到自己的节奏, 带起节奏

2.  程序员如何提升技术,  务实谦虚, 好学好问善于交流, 认真有担当, 关键时刻要顶住.

(纯属个人扯淡, 欢迎交流打脸, 错误是难免的,指出就会改正)

以上是我最近面试几次的感悟, 希望能帮助到大家, 互相思索,共同提高.拜~~~ , 欢迎交流推荐.

 

posted on 2016-04-08 20:03  喜欢兰花山丘  阅读(1735)  评论(9编辑  收藏  举报