头条主要是手撕算法,这里收集了几篇头条的面筋。
面筋1
●算法题:
○ 二叉树层序遍历(面试官提醒)
○ JS的全排列(10分钟)
● HTTP支持的方法
○ GET和POST的区别
● 301和302的区别
● 如何避免301跳转https(在response中header)
● TCP建立连接的三次握手过程
● 操作系统进程和线程的区别
● 线程的那些资源共享,那些资源不共享
● 设计模式:
○ 单例,工厂,发布订阅
○ 发布订阅怎么做
● linux指令用的多吗,怎么进行进程间通信
● kill指令了解过吗
● B+树了解过吗
面筋2
osi七层模型
tcp和udp
http缓存
正方形一比一,不知道宽
背包算法
函数节流
为什么三次握手,四次挥手
面筋3
一面:
1.简单说项目;
2.项目里用的mq是什么?说说kafka的broker,partition,segment;
3.红黑树知道吗?
4.INNODB的索引是怎么实现的?为什么不用红黑树?
5.MyISAM和INNODB的区别
6.select&epoll?
7.手撕洗牌算法;
二面:
1.详细问项目;
2.你觉得项目的的方案哪里好,哪里不好,为什么?
3.项目处理了一些存在的安全漏洞,此处问了很多安全相关的问题;
3.1 XSS是什么?有哪些类型?
3.2 DDOS?
3.3 SQL注入是什么?怎么预防,原理?
4.手撕代码,怎样买股票获得最大收益;
5.手撕代码,一个数组,求连续和为k的子数组;
三面:
1.微信PC版,扫码登录是怎么做的?
2.NAT地址转换;
3.手撕代码,实现一个比特队列,空间尽可能小,复杂度尽可能低,只能放入0,1;(tips:循环队列,用char数组装)
4.秋招为什么没offer,现在有哪些offer?头条给你发你会来吗?(此处好好说话,千万别作死)
面筋4
一面:
1.Object有哪些方法?
2.Map都有哪些实现?
HashMap vs. ConcurrentHashMap
ConcurrentHashMap如何实现并发访问?(Sychronized+CAS, volatile)
HashMap查找一个元素的时间复杂度?
3.OSI7层协议?有哪些是可靠的网络连接?TCP为什么是可靠连接?cookie vs. session
4.wait() 和notify()
5.final
final修饰的类为什么不可变?
final修饰了一个ArrayList,可以修改ArrayList里面的元素吗
6.SpringBoot启动流程?Spring如何处理一个请求?
7.Linux命令:查看端口的的命令(此处忘记耍帅,<(‵^′)>),查看cpu/內存, 文件权限管理(chmod)
netstat -ntlp //查看当前所有tcp端口·
netstat -ntulp |grep 80 //查看所有80端口使用情况·
netstat -ntulp | grep 3306 //查看所有3306端口使用情况·
8.算法:中序遍历的非递归实现
https://www.cnblogs.com/SHERO-Vae/p/5800363.html
手撕算法:
1.二叉树层序遍历(面试官提醒)——栈完成
2.全排列——交换首字符和第一个字符,然后递归,递归完成之后,还原交换的字符。
3.背包算法——dp
4.手撕洗牌算法——随机选取一个数不超过这个数组最大值,然后从最后一个数字与它取余,然后交换,然后指针向前移动。
5.手撕代码,怎样买股票获得最大收益;——dp问题,dp[i] = dp[i-1]+a[i]-a[i-1];dp[i] = dp[i-1]
6.手撕代码,一个数组,求连续和为k的子数组;——dp[]????
7.手撕代码,实现一个比特队列,空间尽可能小,复杂度尽可能低,只能放入0,1;(tips:循环队列,用char数组装)——循环队列,用char来装,元素只用1位。
8.算法:中序遍历的非递归实现:用栈来实现
面筋5
1.swap的概念
Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存变少。当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。
2.查看Swap分区的大小以及使用情况,
一般使用free命令即可,如下所示,Swap大小为2015M,目前没有使用Swap分区
[root@DB-Server ~]# free -m
total used free shared buffers cached
Mem: 1000 855 145 0 28 296
-/+ buffers/cache: 530 470
Swap: 2015 0 2015
另外我们还可以使用swapon命令查看当前swap相关信息:例如swap空间是swap partition,Swap size,使用情况等详细信息
[root@DB-Server ~]# swapon -s
Filename Type Size Used Priority
/dev/sda3 partition 2064344 0 -1
[root@DB-Server ~]# cat /proc/swaps
Filename Type Size Used Priority
/dev/sda3 partition 2064344 0 -1
3.释放Swap分区空间
[root@testlnx ~]# free -m
total used free shared buffers cached
Mem: 64556 55368 9188 0 926 51405
-/+ buffers/cache: 3036 61520
Swap: 65535 13 65522
[root@testlnx ~]# swapon -s
Filename Type Size Used Priority
/dev/mapper/VolGroup00-LogVol01 partition 67108856 14204 -1
使用swapoff关闭交换分区
[root@testlnx ~]# swapoff /dev/mapper/VolGroup00-LogVol01
使用swapon启用交换分区,此时查看交换分区的使用情况,你会发现used为0了
[root@testlnx ~]# swapon /dev/mapper/VolGroup00-LogVol01
[root@testlnx ~]# free -m
total used free shared buffers cached
Mem: 64556 55385 9171 0 926 51406
-/+ buffers/cache: 3052 61504
Swap: 65535 0 65535
[root@testlnx ~]#
4. 是否不需要保留Swap交换分区呢?
我们知道Linux可以使用文件系统中的一个常规文件或独立分区作为Swap交换空间,相对而言,交换分区要快一些。但是和RAM比较而言,Swap交换分区的性能依然比不上物理内存,目前的服务器上RAM基本上都相当充足,那么是否可以考虑抛弃Swap交换分区,是否不需要保留Swap交换分区呢?
其实保留swap分区概括起来可以从下面来看:
首先,当物理内存不足以支撑系统和应用程序(进程)的运作时,这个Swap交换分区可以用作临时存放使用率不高的内存分页,把腾出的内存交给急需的应用程序(进程)使用。有点类似机房的UPS系统,虽然正常情况下不需要使用,但是异常情况下, Swap交换分区还是会发挥其关键作用。
其次,即使你的服务器拥有足够多的物理内存,也有一些程序会在它们初始化时残留的极少再用到的内存分页内容转移到 swap 空间,以此让出物理内存空间。对于有发生内存泄漏几率的应用程序(进程),Swap交换分区更是重要,因为谁也不想看到由于物理内存不足导致系统崩溃。
最后,现在很多个人用户在使用Linux,有些甚至是PC的虚拟机上跑Linux系统,此时可能常用到休眠(Hibernate),这种情况下也是推荐划分Swap交换分区的。
其实少量使用Swap交换空间是不会影响性能,只有当RAM资源出现瓶颈或者内存泄露,进程异常时导致频繁、大量使用交换分区才会导致严重性能问题。另外使用Swap交换分区频繁,还会引起kswapd0进程(虚拟内存管理中, 负责换页的)耗用大量CPU资源,导致CPU飙升。
关于Swap分区的优劣以及是否应该舍弃,我有点恶趣味的想到了这个事情:人身上的两个器官,阑尾和扁桃体。切除阑尾或扁桃体是否也是争论不休。另外,其实不要Swap交换分区,Linux也是可以正常运行的(有人提及过这个问题)
5.linux下查看进程所占IO的大小
iostat
这个只能计算总的IO,没有单独某个进程的。
安装:
#Ubuntu
sudo apt-get install sysstat
#CentOS
sudo yum install sysstat
iotop
这个可以针对单个进程进行查看。
sudo iotop -p $PID -d 1
安装:
#Ubuntu
sudo apt-get install iotop
#CentOS
sudo yum install iotop
linux下查看进程所占内存的大小
TOP 命令输出的列
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
25282 nobody 20 0 428m 110m 93m S 0.0 1.9 0:34.42 php-cgi
输出列信息
● PID 25282
● 用户 nobody
● 虚拟内存 428M
● 物理内存 110M 110*1024= 112640 「和前面计算出来的值基本一致」
● 共享内存 93M
● 进程使用的物理内存和总内存的百分比 1.9 %
PID:进程的ID
USER:进程所有者
PR:进程的优先级别,越小越优先被执行
NInice:值
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:进程占用CPU的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
COMMAND:进程启动命令名称
linux下看进程的端口号相关信息
1、lsof -i:端口号
2、ps -aux | grep PID
面筋6
一面:
编程:
翻转二叉树:镜像的问题
最大连续子串和:dp问题
二面:
编程:
给一棵边权树树找到最大路径,要找到两个端点怎么办
用栈来维护路径的节点和
三面:
编程:
给一个字符串和单词列表,判断字符串能不能由这些单词组成
给定一组股票的价格,最多买卖一次,问最大收益,dp问题
就是给一个字符串,得到它字典序最大的子序列。(他的表述方式是,删除一些字符,使得剩下的字符构成的字符串字典序是最大的)
面筋7
一面:
手撕代码,股票买入买进最佳时机,LeetCode上原题(有6道变形)
二分查找,写的递归,要求转成循环方式
二面(半小时):
n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N),在面试官提醒下写出来了,用栈+栈底指针
三面(半小时):
实现一个二叉树的持久化方案,可以伪代码,必须用指针
主要是序列化和反序列化的过程
(卡在指针的持久化,然后他不是很满意,说我应该做得出,然后我只能把我的另一种不用指针的方案给他讲,才算勉强过)
实现二叉树的层序遍 再按层输出——树的广度搜索,可以用队列实现
面筋8
一面
1.一个经典的题目,给你n 个数,每个数数据范围[0, n-1],问你是否有重复(当然这题很简单)
题目链接
https://www.nowcoder.com/questionTerminal/623a5ac0ea5b4e5f95552655361ae0a8
2.把第一题每个数的数据范围改成 任意正整数
3.把第一题每个数的范围改成 任意整数,要求时间O(n),空间O(1)
二面
丢下一个题,二叉数求最近公共祖先——利用左右大小的特性,从根开始判断。
三面
第一题好像是个链表的,几下写完了,然后面试官又抛出一个合并k个链表,我的做法是用最小堆去维护,然后面试官说可以,建立最小堆,每次取数据到最小堆中,
第三题好像是按照字典序打印1~N的排序,从1开头比N小的数开始枚举就好了