C基础 北京大公司面试简单总结
作者有话说
这是关于程序员面试的一篇文章, 希望对你有帮助. 干了快3年了. 可以简单参考, 对比总结.虽然本人很水.
很喜欢当前做的手游项目.做的很认真.后端每个人技术都很好.但是结果都不如意.在死亡线上挣扎.
目前基本上老大都找小弟们谈谈走的事. 但是我的老大还有老大的老大希望我继续留下来. 哎, 但想出去看看.
简单的自扯一点. 我是2013年退学出来干IT. 当时做window后端相关开发. 后面从事Linux后端开发. 用过
较多语言,技术很一般.
干了那么久有点明白了, 产品比技术重要......
那开始说正题吧, 最近1-2周面过的那些名门.帮同事面的就不写了,也比较多.都很相似.
面 一个最好的团购部门
我的同事跳槽进去了,内推我进去. 主要是做高性能Web相关开发.这方面没有项目经验,但面试我的人很热心.
耐心的同我讲解Web框架,流程等. 其中问我一个问题是
/* * 1. 怎么判断一个字符串是个合法的ip串. */
需要手写.再扯一点, 面的东西太多了就找一个有代表性的面试题吧.
主要思路是 以 ip4 为例 *.*.*.* => *.*.*.* 以 '.'和 分割成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]){ // *.*.*.* 以'.' 和 分割 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 ", ips, isipv4(ips)); ips = "192.168.1.34.45"; printf("%s => %d ", ips, isipv4(ips)); ips = "192.0.01.34"; printf("%s => %d ", ips, isipv4(ips)); ips = "192.168.1.341"; printf("%s => %d ", ips, isipv4(ips)); ips = "0.77.1.a4"; printf("%s => %d ", 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]){ // *.*.*.* 以'.' 和 分割 n = 0; ncut = -1; ++dcut; } } while((*++ips) && (dcut<4) && (++ncut<=3) && (++scut<=15)); return dcut==4 && !*ips && ncut<=3 && scut<=15; }
面 一个最好的手游工作室
这个面试基本上刷新了我的面试记录. 都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! ", 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 ", 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 ", str, flag); else printf("str:%s => %d ", 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; }