一面(8.19)
聊聊你研究生的课题(智能机器人相关)
几个做的啊,分工是什么样的
如果以后想把你们做的东西商业化 产品化,怎么去收集用户的信息?
云?用户定期上传数据到云服务器,公司负责处理这些数据(不懂。朝着云的方向扯了一些)
进程与线程的区别
调度:进程是资源管理分配的基本单位,线程是程序执行调度的基本单位。
切换:线程上下文切换比进程上下文切换要快得多。
拥有资源: 进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源。
系统开销: 创建或撤销进程时,系统都要为之分配或回收系统资源,如内存空间,I/O设备等,OS所付出的开销显著大于在创建或撤销线程时的开销,进程切换的开销也远大于线程切换的开销。
线程一般存在什么地方?线程里有什么东西?
额。有没有大佬懂的评论区指导一波,当时卡住了。。
说说看自己对LRU的理解。实现思路
最近最少使用机制,是操作系统中用来实现页面替换的一种优秀的算法。本质上是一种双向链表的数据结构,用哈希表来辅助维护里面的节点位置。插入时先看看哈希表里有键值冲突:没有的话,用键值新构造一个节点,插入到链表中,并移到链表头,再看看有没有越界,越了的话要把尾部节点删除;同时放入哈希表中。有的话,用新值代替旧值,然后移到链表头。若读取,判断键对应的节点存不存在,存在的话读值并把节点移到头部。其中涉及到把节点移到链表头、删除链表尾的操作。附上实现,面试官让口述:
public class Solution {
/**
* lru design
* @param operators int整型二维数组 the ops
* @param k int整型 the k
* @return int整型一维数组
*/
class DoubleListNode {
int key;
int val;
DoubleListNode pre;
DoubleListNode next;
DoubleListNode() {}
DoubleListNode(int key, int val) {
this.key = key;
this.val = val;
}
}
DoubleListNode head = new DoubleListNode(-1, -1);
DoubleListNode tail = new DoubleListNode(-1, -1);
HashMap<Integer, DoubleListNode> map = new HashMap<>();
public int[] LRU (int[][] operators, int k) {
// write code here
ArrayList<Integer> ans = new ArrayList<>();
head.next = tail;
tail.pre = head;
int size = 0;
for(int i = 0; i < operators.length; i++){
int tmp_key = operators[i][1];
DoubleListNode node = map.get(tmp_key);
if(operators[i][0] == 1){
if(node == null){
DoubleListNode new_node = new DoubleListNode(tmp_key, operators[i][2]);
map.put(tmp_key, new_node);
add2head(