Skip to content

TomorrowWu/interview

Repository files navigation

interview

算法�与数据结构

常见面试题

数组

链表

队列

跳表

递归

排序

先构建十条io流,分别指向十个文件,每条io流读取对应文件的第一条数据,
然后比较时间戳,选择出时间戳最小的那条数据,将其写入一个新的文件,
然后指向该时间戳的io流读取下一行数据,然后继续刚才的操作,比较选出最小的时间戳数据,写入新文件,io流读取下一行数据,
以此类推,完成文件的合并, 
这种处理方式,日志文件有n个,数据就要比较n次,每次比较选出一条数据来写入,时间复杂度是O(n),空间复杂度是O(1),几乎不占用内存,

根据年龄,给100万用户排序

计数排序

如何在1000万个整数中快速查找某个整数?(内存限制是100MB,每个数据大小是8字节)

- 解决: 将数据存储在数组中,内存占用80MB,从小到大排序,再二分查找算法
- 散列表和二叉树等支持快速查找的动态数据结构,大部分情况下,二分查找可以解决的问题,用上述两种数据结构都可以解决
- 但是,上述两种结构需要比较多的额外的内存空间,100MB内存存不下
- 二分查找底层依赖的是数组,除了数据本身以外,不需要额外存储其他信息,最省内存

二分查找

散列表(Hash表)

如何通过编程,求给定一棵二叉树的确切高度

- 第一种是深度优先思想的递归,分别求左右子树的高度。当前节点的高度就是左右子树中较大的那个+1
- 第二种可以采用层次遍历的方式,每一层记录都记录下当前队列的长度,这个是队尾,每一层队头从0开始。
然后每遍历一个元素,队头下标+1。直到队头下标等于队尾下标。这个时候表示当前层遍历完成。
每一层刚开始遍历的时候,树的高度+1。最后队列为空,就能得到树的高度。

哈希算法

计算机网络

负载均衡为什么要分地址和运营商呢?

为了返回最优的IP,即离用户最近的IP,提高访问速度

MySQL

一次会话,多个命令要么都执行成功,要么都执行失败

Redis

网络协议

分布式系统

区块链

Base58编码转换过程

相当于将一个二进制数字,转换为58进制

系统设计

counter = current_time # for example 15:03
count = INCR counter
EXPIRE counter 60 # just to make sure redis doesn't store it forever

if count > 5
  print "Exceeded the limit"

操作系统

- 进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
- 线程是进程的一个实体,是CPU调度和分派的基本单位,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据
- 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈                                                     

Linux

你常用的5个Linux命令

1. grep: 文本搜索   ps -ef|grep java:查找指定进程
2. cp: 复制文件     cp file1 file2 file3 dir :把文件file1、file2、file3复制到目录dir中
3. mv: 移动文件、目录或更名   mv file1 file2 file3 dir : 把文件file1、file2、file3移动到目录dir中   mv file1 file2 : 把文件file1重命名为file2  
4. rm
5. ps: 列出系统中当前运行的进程
6. kill: 杀死进程
7. tar: 压缩,解压
8. chmod: 改变文件权限
9. tail:  tail -f 20160921.logs :查看正在改变的日志文件   tail -3000 catalina.out:查看倒数前3000行的数据  tail -3000 catalina.out | grep 'AA':查看倒数前3000行包含字母'AA'的数据
10. lsof -i:8080:根据端口查看进程pid
11. ps -ef|grep ganache-cli | grep -v grep|sort -nrk2|head -n 1|awk '{print $1,$4}'
-v : 屏蔽 
wc chap1: 显示文件中的行数,字数,和字节数
sort -nrk2: r: 从大到小 k2:第几列
head -n 1: 头部的 1行
awk '{print $1,$4}' log.txt: 输出文本中的1、4项
12. top:查看当前系统的运行情况
13. tar: 解压
14. du -sh * | sort -n 
查看当前目录大小,并按文件大小排序

查看进程

1,ps -ef|grep mysql
2. netstat -anp|grep 3306
3. lsof -i:3306    (list of file )

Linux系统的/proc目录的作用

在GUN/Linux操作系统中,/proc是一个位于内存中的伪文件系统(in-memory pseudo-file system)。
该目录下保存的不是真正的文件和目录,而是一些“运行时”信息,如系统内存、磁盘io、设备挂载信息和硬件配置信息等。
proc目录是一个控制中心,用户可以通过更改其中某些文件来改变内核的运行状态。
proc目录也是内核提供给我们的查询中心,我们可以通过这些文件查看有关系统硬件及当前正在运行进程的信息

分布式

分布式系统、集群、负载均衡

不同机器部署不同的服务,对外暴露一个系统
不同机器相同的服务,对外暴露一个服务
平衡的将任务分给集群中的每一个服务

智力题

总共100个球,两个人分别拿,至少拿一个最多拿5个,你先拿怎么保证你能拿到第100个

就是用逆向归纳的方法:如果最后你拿完剩1、2、3、4、5个球,那么则是对方拿到了第100个球。所以你的目标就是剩余6个球,这样无论对方怎么拿,你都能拿到100个球。由此类推,倒数第二次,你的目标就是剩余12个球,这样不管对方拿几个,你都可以将剩余球的个数变为6个,从而变为前面说的那种情况,而拿到第100个球。于是,不难归纳出,只要每次你的目标是剩余球的个数为6的倍数,那么你肯定最终拿到第100个球。
所以,如果最开始有100个球,那么只要你先拿4个,使剩余球的个数为96个(96=16×6),那么最后拿到第100个球的肯定是你

Go语言

Releases

No releases published

Packages

No packages published

Languages