后台面试汇总

做者:闪电⚡晨晨
连接:https://www.nowcoder.com/discuss/52422?type=2&order=0&pos=74&page=1
来源:牛客网

一、线程和进程的区别 进程: 并发执行的程序在执行过程当中分配和管理资源的基本单位 进程的执行过程是线性的,进程的切换保护资源。 线程: 是CPU调度的基本单位 线程共享进程中的资源,线程的切换并不影响计算机软硬件资源的分配。node

二、中断和异常的区别 中断: 系统中止当前正在运行的程序而转向其余服务 异常: 软件运行过程当中的一种开发过程当中没有考虑到的程序错误 也称为同步中断,在指令执行结束后发生的中断linux

3虚拟内存和虚拟地址 虚拟内存: 程序使用的内存,利用外存来扩充内存,须要内存映射 虚拟地址: 由页号和偏移量组成,位数与地址总线的位数相同redis

四、死锁 必要条件: (1)互斥条件:一个资源每次只能被一个进程使用 (2)请求与保持条件:进程因请求资源而阻塞时,对得到的资源保持不放 (3)不剥夺条件:已得到资源,未使用完以前不能被剥夺 (4)循环等待条件:算法

   解决方法: (1)死锁预防:破坏死锁产生的条件 (2)死锁避免:每次申请以前判断是否安全(银行家算法) (3)死锁检测:(超时法和等待图法) (4)死锁解除 sql

五、内联函数和宏定义 宏定义: 预编译阶段 不作类型检查 内联函数: 编译阶段 作类型检查 短小函数 频繁调用形成内存膨胀shell

六、数据库索引 惟一索引 索引值惟一,但容许有空值 主键索引 特殊的惟一索引,但不容许有空值 普通索引 组合索引 多个属性值构成的索引 数据库

七、汇集索引&非汇集索引 汇集索引 索引键值的逻辑顺序决定了数据的物理储存顺序 叶子节点就是数据块 非汇集索引 索引键值的逻辑顺序与数据的物理顺序可能不一致 叶子结点是指向对应数据块的指针 B+树&平衡二叉树 B+数 全部关键字出如今叶子节点 非叶节点是索引,叶子节点是 储存 更适合作文件索引系统 查找性能接近二分查找树编程

八、设计模式 设计模式

  一、简单工厂模式:针对一样的数据,不一样的操做用一样的接口。由工厂类建立不一样的产品,不一样的产品都是抽象类的继承类。数组

  二、工厂方法:针对一样的数据,不一样的操做使用不一样的接口。

  三、抽象工厂:针对不一样的数据,不一样的操做使用不一样的接口。

九、10亿个数找10个频率最高的 

  一、利用hash方法把数据集分红几个部分。

  二、利用hash统计每一部分的词频。

  三、利用堆排序求出每一个数据集的前k个.

  四、合并每一个数据集的前k个。 

十、1001里两个重复的数字 抑或 

十一、最大回文子串 动态规划,记录左边回文的最大右边界 

十二、100层楼丢两个鸡蛋 不等式约束求最大值

1三、三狼过河智力题 深度优先搜索

1四、斐波那契数列的变形 跑楼梯 

1五、二叉树层次遍历(如何只遍历某一层) 队列实现, 1

六、链表反转 注意参数取值 1七、二叉树后序遍历,递归和非递归

1八、经常使用排序算法的稳定性 快排,堆排,希尔排序不稳定,举例子

1九、为何静态单例对象? 单例模式惟一的实例必须为静态 不能建立对象,只能经过类中的接口来调用类中建立的对象。 使用类名直接调用类中的方法,因此类中的成员函数和数据成员必须是静态的。 

20、linux系统的特色 开放性,多用户,多任务,良好的界面,设备独立性:操做系统把全部的设备统一看成文件来处理,可靠的安全系统,良好的移植性:适应各类平台,丰富的网络功能。

2一、多进程和多线程 前者开销大,后者开销小(数据,资源角度),前者更加独立。 

2二、多线程编程要点,如何保证线程间数据访问的安全性 负载平衡,发挥每一个核的做用。互斥和同步。 

2三、一棵有序的二叉树中搜索到给定值 二叉排序树 

2六、虚函数(做用及实现) 参考简单工厂模式。 

2七、http协议(请求方式get和post的区别,不一样的状态码,URL规格,404是什么错误) get:请求读取,post:请求添加信息,1xx: 通知信息,2xx:成功,3xx:重定向,4xx:客户端出错,5xx:服务器出错,<协议>://<主机域名>:<端口号>/<具体路径>,not found

2八、网页的推荐是怎么实现的(cookie,session是什么?储存在什么位置,起什么做用?) cookie记录访问网页的状况。Cookie保存在客户端,session保存在服务器端。

2九、10亿个11位的号码中找给定号码是否存在 bool过滤器 

30、linux系统中的经常使用命令 cd,gcc,ls(文件列表),grep,cp(拷贝全部文件),find,mv(移动文件),rm(删除),ps(查看某一时刻进程的运行结果),tar(打包),time(测算一个命令的执行时间)

3一、I/O多路复用(select,poll,epoll各自的原理,区别,如何使用) 经过一种机监视多个描述符,一旦就绪方可运行。Select: 每次调用,都须要把文件描述符从用户态拷贝进内核态;从内核态遍历全部的文件描述符;支持的文件数量小。

3二、项目中遇到的最大困难,如何解决,项目的最大成就

3三、找出数组中最大的连续和 动态规划,当前最大值 

3四、三个协程按照顺序输出

package main

import (
	"sync/atomic"
	"time"
	"fmt"
)

func main() {
	var number uint32 = 10
	//count至关于一个接力棒
	var count uint32
	trigger := func(i uint32, fn func()) {
		//自旋锁
		for {
			if n := atomic.LoadUint32(&count); n == i {
				fn()
				//必定要在执行完函数后才原子加1
				atomic.AddUint32(&count, 1)
				break
			}
			time.Sleep( 1 * time.Millisecond)
		}
	}

	for i := uint32(0); i < number; i++ {
		go func(i uint32) {
			fn := func() {
				fmt.Println(i)
			}
			trigger(i, fn)
		}(i)
	}
	trigger(number, func(){})
	//会按照天然数顺序打印(必定是这样)
}

 

3五、hash表和B+树的优点 **数据库索引** 一、惟一索引hash占明显优点。二、范围查找B+树占明显优点。三、B+树查找速度不会有太大波动。

3六、合并两个有序链表 

func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
	var datas []int
	for {
		if l1 != nil {
			datas = append(datas, l1.Val)
			l1 = l1.Next
		} else {
			break
		}
	}
	for {
		if l2 != nil {
			datas = append(datas, l2.Val)
			l2 = l2.Next
		} else {
			break
		}
	}
	for i := 0; i < len(datas)-1; i++ {
		for j := 0; j < len(datas)-1-i; j++ {
			if datas[j] > datas[j+1] {
				datas[j], datas[j+1] = datas[j+1], datas[j]
			}
		}
	}
	if len(datas) == 0 {
		return nil
	} else {
		l3 := &ListNode{datas[0], nil}
		l3Node := l3
		for i := 1; i < len(datas); i++ {
			l3Node.Next=&ListNode{datas[i],nil}
			l3Node=l3Node.Next
		}
		return l3
	}
}

 

3七、数据库范式 2NF:非主属性彻底函数依赖于码。3NF:非主属性不传递依赖于码。BCNF: 任何函数以来都含有码。 

3八、快速排序算法(手写) 递归&非递归

func quickSort(values []int,left,right int){
 
    temp:=values[left]
    p:=left
    i,j:=left,right
 
    for i<=j{
        for j>=p && values[j]>=temp{
            j--
        }
        if j>=p{
            values[p]=values[j]
            p=j
        }
 
        for i<=p && values[i]<=temp{
            i++
        }
        if i<=p{
            values[p]=values[i]
            p=i
        }
 
    }
 
    values[p]=temp
 
    if p-left>1{
        quickSort(values,left,p-1)
    }
    if right-p>1{
        quickSort(values,p+1,right)
    }
 
}
 
fund QuickSort(values []int){
    quickSort(values,0,len(values)-1)
}

 

3九、单例模式中的多线程问题如何解决 懒汉模式:加同步锁,双重检测锁定、静态内部类(相似恶汉模式)。

40、数据库,左右链接,内连接 内连接:只有两个表相匹配的行才在结果中出现。外链接:左外链接,右外链接,完整外部链接。

4一、二叉树的遍历 前中后非递归 

4二、linux命令查看CPU的使用状况 top 

4三、CPU load命令 进程对列的长度(CPU作多少工做)

4四、数据库事务的隔离级别 55

4五、脏读,幻读,丢失修改 (读完另外一方RoLLBack)、(读完对方已修改再读)、(改完别人又改)

4六、锁的类型(排他锁、共享锁) 排他锁(X锁):只容许加锁一方读取和修改数据其它不能加任何类型的锁。共享锁(S锁):加锁一方和其它的只能读,其它只能加S锁。

4七、字母字符串排序,AaB 从新定义比较函数

4八、字符串找出不重复的字符组成的子串 hash表 

4九、消息队列 不懂 

50、页面置换算法 FIFO,LRU,LFU(最不长使用)

5一、抖动 刚被置换出的页面立刻又被使用 

5二、缺页中断 页表没有,调入内存 

5三、条件几率 盒子有球问题

5四、九宫格交换棋子

5五、数据库隔离级别 

  一、可读取未确认:写事务阻止写事务,但未阻止读事务(脏数据)。

  二、可读取确认:写事务阻止读写事务,但读事务不阻止其它事务(不可重复度)。

  三、可重复读:读事务阻止写事务,但不阻止其它事务(丢失修改)。

5六、绳子覆盖数轴上的点 两个端点,小于前走,大于后走 

5七、2sum和ksum问题 hash方法或排序后左右夹逼,ksum经过遍历转化为2sum问题。 

5八、数据库failover

5九、AQS(如何管理线程,实现公平锁和非公平锁) 

60、蓄水池问题

6一、实现大数相乘 字符串储存,注意进位

6二、操做系统磁盘的了解

  物理结构:盘片、磁道、扇区。

  逻辑结构:引导控制块(系统从该分区引导操做系统有关信息),分区控制块(分区的详细信息)。

  调度算法:FCFS、SSTF、SCAN、C-SCAN 

6三、linux shell

6四、操做系统内存碎片 

6五、编程实现:1!+…+N! 

6六、sql查询语句

6八、分布式session三种实现方式和优缺点 

6九、重建二叉树 

70、二份查找 左右边界 

7一、字符串全排列(时间复杂度) 递归算法(按次序交换两个字符的位置),O(n!) 

7二、数组有正有负,移到两边 快速排序,中轴为0,swap(a[index++],a[i]); 

7三、判断整数是否为2,4,8的幂次方 return x&(x-1)==0; return x&(x-1)==0&&x&0x55555555!=0; int i; for(i=0;n!=1;i++) n=n>>1; return x&(x-1)&&i%3==0; 

7四、旋转有序数组,找到其中的一个值(leetcode) 肯定左边有序仍是右边有序 

7五、nat协议 网络层协议:网络地址转换,将本地IP地址转换为全球IP地址,使专用网内部的主机与因特网上的主机通讯。

7六、arp协议 数据链路层:地址解析协议(由IP地址得到MAC地址),在本局域网内广播发送请求,响应数据帧是单波发送。(NAPT)

7七、ip地址和mac地址的区别

  ip地址:网络层地址,包含网络号和主机号,点分十进制表示IPv4 32位,IPv6 128位。

  mac地址:物理地址,适配器地址,数据链路层的地址。

7八、常见的单例模式

单例模式:某一实体类只需存在一个对象就能够知足全部的业务需求。

  一、其余类没法初始化该类的对象(构造函数为私有类型)。

  二、该类能够在类中实例化一个惟一的自身对象(静态对象)。

  三、当前类能够向外界提供一个惟一的接口来提供实例,并返回一个该类的对象(静态函数)。 

恶汉模式: 实例在加载类时创建。线程安全(其余类不能修改实例)

懒汉模式: 其余类调用该类的获取方法时建立实例。线程不安全(多个线程建立多个实例) 

8一、观察者模式用法,实现 

8二、hash解决冲突的方法,如何保证多个hash函数不会出现死循环

8三、如何破坏单例 反射机制和序列化机制

8四、64G内存如何设置堆大小

85丶redis数据类型:   Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

86.  redis怎么实现排行榜  有序集合zset

87.  go的协程调度   PMG  咱们能够从上面的图里看到两个线程(M),每一个线程都拥有一个上下文(P),每一个线程都正在运行一个goroutine(G)。为了运行goroutines,一个线程必须拥有一个上下文

88. 解决hash冲突  :

  1.开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列)
  2.再哈希法
  3.链地址法(Java hashmap就是这么作的)
  4.创建一个公共溢出区

89.  hash倾斜 :

    为了解决hash倾斜难题,一致性算法是这样的,节点和节点造成一个环。好比

  A->B->C->A,这样一个环。数字hash后落在环上,而不是落到某个node。好比落在a~b node之间,经过顺时针转,这个数字归b节点管。

  可是若是节点不多,一样容易出现倾斜,负载不均衡问题。因此一致性哈希算法,引入了虚拟节点,在整个环上,均衡增长若干个节点。好比a1,a2,b1,b2,c1,c2,a1和a2都是 属  于A节点的。

    经过让闭环上的节点增长,来平衡各个节点散列的值。

90.  100亿个数选top5,小根堆

91.  goroutine泄漏有没有处理,设置timeout,select加定时器

92.  select、epoll

93.  go  map  -->  hashmap

94.  有没有网络编程,有,怎么看链接状态?netstat,有哪些?ESTABLISHED,LISTEN等等,有异常状况吗?TIME_WAIT不少,为何?大量短连接

相关文章
相关标签/搜索