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