WPS2016校园招聘服务端研发笔试题(网)
WPS2016校园招聘服务端研发笔试题(网)
姓 名: 性 别: 学 位:
毕业院校: 所学专业:
***话: 电子邮件:
温馨提示:笔试时间为120分钟,如因时间不够,请挑好题目认真且细致答题,切记不要因时间不够,而选择走马观花把所有题目答完,但质量又不高,期望你能顺利通过我们的笔试。
一、 参照日常银行取款机,画出取款、转账两个流程图,注意特殊情况和严谨判断
顶层数据流图
银行卡 交易凭条
一层数据流图
交易凭条
取款
现金
转账
二、设计一个简单的IM聊天软件
场景a:
两个用户处在同一个局域网,用户1需要向用户2发送消息,但用户2此时离线, 要求用户1发出的消息用户2下次上线能收到
场景b:
三个用户处在同一个局域网,用户1需要同时向用户2和用户3发送群消息,用户 2离线,用户3在线,要求用户3能立即收到消息,同时用户2下次上线能收到
说明:
设计完整的数据库表结构,并写出存、取以及删除消息对应的SQL语句
设计交互协议,包括登录、发送消息、接收消息,提示:可参照HTTP restful,或者Redis、Mem***d的protocol
加分项:对于需要及时推送的消息,采用何种方式实现,long pull还是push?分别有什么优缺点?
设计完整的数据库表结构,
用户表(userInfo)
列名 | 数据类型 | 长度 | 是否主键 | 是否为空 | 备注 |
userID | varchar | 20 | 是 | 否 | 用户ID |
username | varchar | 20 | 否 | 否 | 用户名 |
userPwd | varchar | 20 | 否 | 否 | 密码 |
userStale | bit | 1 | 否 | 否 | 登陆状态:0:离线,1:在线 |
信息表( sendMessage )
列名 | 数据类型 | 长度 | 是否主键 | 是否为空 | 备注 |
sendUserID | varchar | 20 | 是 | 否 | 发送端 |
receiveUserID | varchar | 20 | 是 | 否 | 接收端 |
sendMessage | Varbinary | Max | 否 | 否 | 发送的数据 |
sendData | varchar | 20 | 否 | 否 | 发送消息的时间 |
isRead | bit | 1 | 否 | 否 | 是否看过本信息。0:未看过 1:看过 |
交互协议
登录、发送消息、接收消息
使用 http 协议进行的请求 / 响应模式的消息交换,并使用 HTTP 方法: GET 、 POST 设置与获得消息。
三,实现一个LRU(Least Recently Used) Cache
要求:
1 ,生成一个LRU ***,可存放n个任意object
参考:NewLRUCache(n int)
2 ,设置value,如果key原先存在,用value覆盖原始数据,否则新建;如果object的数量超过了n,则删除最老的数据
参考:Set(key string, value object)
3 ,根据key获取value,如果没有,则返回空
参考:Get(key string) value
加分项:考虑多线程并发问题
说明:可以用任意语言或伪代码实现
class Entry {
Object value;// 值
string key;// 键
}
public class LRUCache {
private int ***Size;
private Hashtable<Object, Entry> nodes;// 缓存容器
private int currentSize;
public LRUCache(int n) {
currentSize = 0;
***Size = n;
nodes = new Hashtable<Object, Entry>(n);// 缓存容器
}
public void Set(key string, value object) {
// 如果 key 原先存在,用 value 覆盖原始数据,否则新建
Entry node = nodes.get(key);
if (node == null) {
// 如果 object 的数量超过了 n
if (currentSize >= ***Size) {
nodes.remove(last.key);
removeLast();
} else {
currentSize++;
}
node = new Entry();
}
node.value = value;
moveToHead(node);
nodes.Set(key, node);
}
public Entry Get (key string) {
Entry node = nodes.get(key);
if (node != null) {
moveToHead(node);
node.value = value;
return value;
} else {
return null;
}
}