Summarization of Tech Interviews
Summarization of Tech Interviews(技术面试总结)
手心网(2015)
Q1. 解释一下 TCP/IP 协议之滑动窗口?
滑动窗口协议的维基:https://en.wikipedia.org/wiki/Sliding_window_protocol
Q2. UDP 包大小,什么时候应该用 UDP / TCP?
UDP 包大小理论上在 8 - 65535 byte ,IPv4 协议下数据域实际大小:65507 byte。
Q3. 抽奖/秒杀/抢购系统的设计?
贾浩:利用 MySQL 特性来解决“写数据的原子性”。缺点:“原子性的写”可能是靠加锁实现,这也就大大降低了性能,因为 Unix 是分时系统。
我:应该根据用户量,酌情使用 redis 集群特性。使用 hashtable 数据结构,这样能在 O(1) 的时间复杂度内完成判断。使用“一致性 hash ”路由算法。 0~\(2^{32}\) 空间内,对用户ID进行模运算。
贾浩 A:利用 update 操作的原子性,预先设置抢购商品数量个令牌,当用户请求来时,先校验所剩的令牌数,有剩余表示该用户可以抢购。
UPDATE 抢购表 uid = $uid, token = 0 Where token = 1 and token = 1
我 A : MySQL 并发时,可以加写锁:最常用的两种引擎大概是 MyISAM 和 InnoDB,他们分别实现了表锁和行级锁。
令牌系统,不合理的请求在前端被档,不会到后端,保证了后端系统稳定。这也保证了 MySQL 写数据的原子性。A 2 : 令牌桶算法(Token Bucket)——网络流量整形、速率限制
贾浩:抢购系统原理 UPDATE 原子性 + token 预先分配
Q4. call_user_func VS. sql_autoload_register() + spl_autoload() 方案选择
贾浩:为什么不用 PHP 原生特性?
我:使用 SPL 加载类,可以保证框架的完全面向对象特性,比如使用
Input::get('name');
URL::segement(3);
如果使用 call_user_func 必须先手动加载对应文件,所以 CI 框架会有丑陋的写法:
$this->load->('input'); //都需要先load
$this->input->get('name');
$this->load->('url'); //需要先load
$this->url->segement(3);
链家网——电话面试(2015)
Q1. 十万个数,找出最小的前K个?
解
容量为K的最小堆,时间复杂度O(N × logK),《编程之美》之“2.5寻找最大的K个数”。
Q2. PHP 生命周期?
Q3. fpm 生命周期?
链家——现场面试(2015)
Q1. 如何改善你的“Power 8 极限算法挑战赛第六期”算法?
解
用 bitset 改善“Power 8 极限算法挑战赛 第六期”程序,优化程序所使用的内存。优化后,空间占用减少到3MB。程序数据将会存储在CPU cache L3 中,数据相对CPU的“距离”越近、读写速度越快。
Q2. 外部排序:利用 3MB 的内存空间对磁盘中 10G 的数进行排序,数据取值范围 0 ~ 10^7?
解
使用“多趟桶排序”进行排序。但技术总监面(二面时)否定了该解法。我后来反思觉得,用多趟桶排序还是能解的!(具体解法有待后续更新)
2016年6月28日更新:
利用B树也是很好的解决方式,而且很多成熟的方案(比如MySQL)都是在利用B树的变种来组织数据。首先,生成B树、然后从小到大地层序遍历,这样就相当于进行了排序。
Q3. 动态规划之以O(n)时间复杂度解决 “最大连续子数组和”问题?
int MaxSubString(int* A, int n)
{
int Start = A[n - 1];
int All = A[n - 1];
for (int i = n - 2; i >= 0; i--) //从后向前遍历,反之亦可。
{
Start = max(A[i], A[i] + Start);
All = max(Start, All);
}
return All; //All[0] 中存放结果
}
参考资料:http://www.cnblogs.com/waytofall/archive/2012/04/10/2439820.html
Q4. PHP zval 的代码实现?
解:
它的实现是在 Zend/zend.h 文件中。:
struct _zval_struct {
zvalue_value value; /* 变量的值 */
zend_uint refcount__gc;
zend_uchar type; /* 变量当前的数据类型 */
zend_uchar is_ref__gc;
};
typedef struct _zval_struct zval;
//在Zend/zend_types.h里定义的:
typedef unsigned int zend_uint;
typedef unsigned char zend_uchar;
保存变量值的value则是zvalue_value类型(PHP5),它是一个union,同样定义在了Zend/zend.h文件里:
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
具体的介绍都在 https://github.com/walu/phpbook/blob/master/2.1.md 里面。
但是 PHP7 之后对 _zval 进行了改进,具体代码定义在 php7.0.3/Zend/zend_types.h 中:
typedef union _zend_value {
zend_long lval; /* long value */
double dval; /* double value */
zend_refcounted *counted;
zend_string *str;
zend_array *arr;
zend_object *obj;
zend_resource *res;
zend_reference *ref;
zend_ast_ref *ast;
zval *zv;
void *ptr;
zend_class_entry *ce;
zend_function *func;
struct {
uint32_t w1;
uint32_t w2;
} ww;
} zend_value;
struct _zval_struct {
zend_value value; /* value */
union {
struct {
ZEND_ENDIAN_LOHI_4(
zend_uchar type, /* active type */
zend_uchar type_flags,
zend_uchar const_flags,
zend_uchar reserved) /* call info for EX(This) */
} v;
uint32_t type_info;
} u1;
union {
uint32_t var_flags;
uint32_t next; /* hash collision chain */
uint32_t cache_slot; /* literal cache slot */
uint32_t lineno; /* line number (for ast nodes) */
uint32_t num_args; /* arguments number for EX(This) */
uint32_t fe_pos; /* foreach position */
uint32_t fe_iter_idx; /* foreach iterator index */
} u2;
};
沈阳小公司(2015)
Q1. 设计抢购系统,分为两种策略:(1)固定中奖概率、固定人数 (2)固定中奖概率、不固定人数?
百度外卖(2016)
Q1. PHP 的 foreach 函数对于如下代码,输出的顺序将是是怎样的?
$arr[0] = 'a';
$arr[2] = 'b';
$arr[1] = 'c';
foreach($arr as $a)
echo $a;
解:
输出 abc。
Q2. 百度外卖的订单系统,怎样设计才能最大程度地拓容?——包含订单表、商户表、用户表?
Q3. 打印回形数组?
Q4. (同链家网)PHP内核 zval 实现?
Q5. 设计一个抢购/秒杀系统?
Q6. 对消息队列的认识和理解,比如 Kafka?
小肚皮(2017)
Q1. 上机写出这样的程序:
该公司有男性员工m人,女性员工n人,要求设计一种算法用来安排周一和周四两天的午餐分组安排,设每组有x人(x是正整数且是偶数),男女比例1:1(某组人数不足x的除外),周一和周四的分组安排不能相同。
HIGO(2017)
Q1. 手写算法,如何从二叉树中找出两个距离最远的节点?
解:
像拎葡萄一样,先从跟节点拎一下,找出最长的节点,记为 node1;然后再从 node1 节点拎一下,找出当前最长的节点,记为 node2。node1 和 node2 既为两个距离最远的节点。
Q2. 上机写 SQL,利用如下三个表,列出每个商店商品数量第一多的类目?列出每个商店商品数量第一多的类目?
shop
sid | sname |
---|---|
1 | s1 |
2 | s2 |
category
cid | cname |
---|---|
1 | c1 |
2 | c2 |
goods
gid | sid | cid | gname |
---|---|---|---|
1 | 1 | 1 | g1s1c1 |
2 | 1 | 1 | g2s1s1 |
3 | 1 | 2 | g3s1c2 |
4 | 2 | 1 | g4s2c1 |
5 | 2 | 2 | g5s2c2 |
6 | 2 | 2 | g6s2c2 |
Summarization of Tech Interviews的更多相关文章
- interview material
Articles Recommended: Steve Yegge – Get That Job at Google [web] Carlos Bueno – Get That Job at Face ...
- think
https://github.com/crossoverJie/Java-Interview Java-Interview https://github.com/aalansehaiyang/tech ...
- (麻省理工免费课程)C语言内存管理和C++面向对象编程
此课程有全部讲义和习题. 课程描述实在得令人发指.翻译如下: 您是否由于自己的Python程序比同僚们的C程序慢而垂头丧气?你是否想不用JAVA实现面向对象?加入我们,学习C和C++吧!我们带您从简单 ...
- amazon interview
I'll be sitting for an Amazon interview in 3 months. Which website should I use to practice: SPOJ, H ...
- 25 highest paying companies: Which tech co outranks Google, Facebook and Microsoft?
Tech companies dominate Glassdoor’s ranking of the highest paying companies in the U.S., snagging 20 ...
- 转 Microsoft's Objective-C tech started on BlackBerryOS, Tizen
今天看到了这个 Microsoft's Objective-C tech started on BlackBerryOS, Tizen 见原文 http://www.osnews.com/story ...
- Atitit 编程语言知识点tech tree v2 attilax大总结
Atitit 编程语言知识点tech tree v2 attilax大总结 大分类中分类小分类知识点原理与规范具体实现(javac#里面的实现phpjsdsl(自己实现其他语言实现 类与对象实现对象实 ...
- CIFAR-10 Competition Winners: Interviews with Dr. Ben Graham, Phil Culliton, & Zygmunt Zając
CIFAR-10 Competition Winners: Interviews with Dr. Ben Graham, Phil Culliton, & Zygmunt Zając Dr. ...
- Tech Stuff - Mobile Browser ID (User-Agent) Strings
Tech Stuff - Mobile Browser ID (User-Agent) Strings The non-mobile stuff is here (hint: you get jerk ...
随机推荐
- php 实现php代码的加密解密
php 代码加密类,大家可以根据自己的需求进行修改,原类如下,是对之前的加密解密类的有一次修改,希望能分享给大家.本次在ubuntu下测试没有问题,与之前的版本的区别在于,这次的版本更加的通用性. & ...
- 如何学Python
如何学习Python? Python上手很容易, 基本有其他语言编程经验的人可以在1周内学会Python最基本的内容.它们包括:1.常用内置类型(int, float, bool, bytes, st ...
- VirtualBox如何扩展虚拟机Ubuntu的硬盘容量-转
https://blog.csdn.net/ouyang_peng/article/details/53261599 摘录要点: 扩展 VBoxManage modifyhd YOUR_HARD_DI ...
- Go win32
先说的让人兴奋的吧,“GO的库开发在windwos上尽然是一摸一样的啊” C:\go-pro\go-self-package>go build gin-main.go 2017/09/20 14 ...
- iOS 测试企业应用的分发
开发者能够方便地来做iOS应用的测试分发,目前可以选用“浦公英”和“Fir.im”来做. 生成IPA文件 生成应用的 IPA 文件可以使用命令行 xcodebuild exportArchive -e ...
- java随机排座位
//打乱学生顺序 Collections.shuffle(); 容我记个单词 peer: vi.凝视; 盯着看; 隐退,若隐若现; 同等,比得上;n.同辈,同等的人; 贵族; 同伴,伙伴;adj.贵族 ...
- jsp的文件包含漏洞
jsp的文件包含分静态包含的动态包含两种: 静态包含:<%@include file="top.jsp"%> 动态包含:<jsp:include page=&qu ...
- 001-http协议-请求报文以及服务器响应状态
Http协议的几个概念: 1.连接(Connection):浏览器和服务器之间传输数据的通道. 一般请求完毕就关闭,http不保持连接.不保持连接会降低处理速度(因为建立连接速度很慢),保持连接的话就 ...
- python 定义函数 两个文件调用函数
在def_function.py文件里面写 #coding=utf-8 #定义函数 def hello(): print "hello world" 在test.py里面调用 #c ...
- C# 如何批量修改集合元素的属性值?
我们往往会遇到要批量修改集合中元素的值,最笨的办法就是foreach循环,但本文介绍几种优雅的方法. 首先,我们准备好元素类和初始集合: 下面就是几种方法,目前并没有对性能做进一步的测试,有兴趣的童鞋 ...