0%

腾讯运营开发实习生一面面经

  1. 自我介绍
  2. 查找进程id ps -ef | grep "process_name"
  3. 刚才的ps命令里参数-e-f是什么意思
  4. ps 命令里大写的 -E参数和-e有什么区别
  5. 查看端口号的命令?
  6. netstat命令用过吗? 做什么的. (用过, 但干什么的忘了)
  7. lsof命令?(我听都没听说过)
  8. 查看cpu,内存的命令? (top, free)
  9. 查看磁盘使用情况的命令?(df, 我一开始回答的du, 后来问du和df的区别的时候才指出我说反了)
  10. dudf区别?
  1. top命令如何查看具体某一核的cpu使用情况? ( 不会 )
  2. 平常用哪些命令抓包? 我回答的是(curlnc命令, 面试官说不是, 但还是让我解释这两个命令的区别)
  3. 抓包工具会吗? (tcpdump) (我只会用chrome浏览器inspect抓包, 面试官说这样的话tcp报文抓不到. 这不废话吗当然抓不到了, 我又不是网络工程师抓tcp包干啥)
  4. 面试官问git用过吗? 我回答用过, 写一个git语句吧, 把feature分支合并到master分支. 不会. 平常实习的时候只用add commit push merge. (垃圾网易, 实习生连合并分支的权限都没有, 只能自己创建个分支自己玩)
  5. git rebase 了解吗? (不了解)
  6. git 查看commit id用什么命令(git log)
  7. 进程和线程区别?
  8. 讲一下上下文切换?
  9. 数据库用的多吗? 非关系型数据库用过吗?
  10. 讲一下mysql事务机制
  11. 写两个sql, 贼简单, 和之前的面试问的sql都不是同一级别的. select * from table order by column1; select column2 from table group by column2; 刚学sql的都会
  12. http常用状态码?
  13. 301, 302有什么区别, 403代表什么意思, 502的bad gateway能解释下吗. (都不会)
  14. http报文格式说一下
  15. http请求体中content-typedata-format两个参数什么意思 (也不会)
  16. https 和 http有什么区别
  17. curl -vvv https://qq.com 这个过程中讲一下, 要建立几次TCP连接?
  18. 最后面试官问了个非常简单的面试问题, 估计是觉得问难的我也答不上来了吧. 说一下TCP三次握手四次挥手

编程题是LFU的设计, 之前在leetcode上面做过LRU的, 这个比LRU复杂一点, 想了一会, 感觉就是LRU里面的链表节点再加上一个cnt变量表示访问的次数, 并且是降序排序的. 每一次就剔除掉链表最后一个节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
LFU缓存结构设计
一个缓存结构需要实现如下功能。
set(key, value):将记录(key, value)插入该结构
get(key):返回key对应的value值
但是缓存结构中最多放K条记录,如果新的第K+1条记录要加入,就需要根据策略删掉一条记录,然后才能把新记录加入。这个策略为:在缓存结构的K条记录中,哪一个key从进入缓存结构的时刻开始,被调用set或者get的次数最少,就删掉这个key的记录;
如果调用次数最少的key有多个,上次调用发生最早的key被删除
这就是LFU缓存替换算法。实现这个结构,K作为参数给出
[要求]
set和get方法的时间复杂度为O(1)

import java.util.*;
public class LFU {
LFU(int K){
maxSize = K;
}
int maxSize;
Map<Integer, ListNode> map = new HashMap<>();
int size = 0;
ListNode listHead = new ListNode();
ListNode listTail = listHead;

public int get(int key){
if(map.containsKey(key)){
ListNode node = map.get(key);
node.cnt++;
ListNode currNode = node;
ListNode prevNode = node.prev;
while(prevNode != null && currNode.cnt > prevNode.cnt){
//swap curr and prev
swap(prevNode,currNode);
prevNode = currNode.prev;
}
return currNode.value;
}
else{
throw new Exception();
}
}

public void set(int key, int value){
if(map.containsKey(key)){
ListNode node = map.get(key);
node.cnt++;
node.value = value;
ListNode currNode = node;
ListNode prevNode = node.prev;
while(prevNode != null && currNode.cnt > prevNode.cnt){
//swap curr and prev
swap(prevNode,currNode);
prevNode = currNode.prev;
}
return currNode.value;
}
else{
if(size == maxSize){
ListNode leastNode = listTail;
//remove leastNode
map.remove(listTail.key);
listTail = leastNode.prev;
listTail.next = null;
leastNode.prev = null;
--size;
}
ListNode newNode = new ListNode(key,value);
map.set(key,newNode);
listTail.next = newNode;
newNode.prev = listTail;
listTail = newNode;
++size;
}

}

private void swap(ListNode, n1, ListNode n2){
ListNode n1_prev = n1.prev;
ListNode n2_next = n2.next;
n1_prev.next = n2;
n2_next.prev = n1;
n2.next = n1;
n2.prev = n1_prev;
n1.next = n2_next;
n1.prev = n2;
}

public static class ListNode{
public int cnt;
public int value;
public int key;
public ListNode next;
public ListNode prev;
ListNode(int value, int key){
this.value = value;
this.key = key;
}
ListNode(){
this(0,0);
}
}
}