算法工程师-京东-知识点-刷题

1、值类型和引用类型
值类型就是:value type 比如:int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值类型变量声明后,无论是否已经赋值,编译器都会给它分配内存空间。

值类型一般要比引用类型要效率高,值类型一般都是采用线程栈来进行内存分类,而引用类型一般都是通过线程堆来进行内存分配。

一般而言:引用类型可以派生出其他类,但是值类型不可以,值类型是被封装的,不能作为其他类型的基类。

对于复制:
值类型在进行复制时,会将一个变量赋给另一个变量,包括本身和值;但是引用类型进行赋值是只能够复制引用,并不涉及到变量本身和他的数值。

详细可以进去看看

添加链接描述

2、多线程中的死锁:
多线程和死锁
多线程:什么是多线程。线程是进程中的一个执行单元,一个进程中可以有多个线程同时进行,也就是以一个程序有多个线程同时执行,并发执行的过程。
程序运行时需要调用CPU,根据分配cpu的方式不同分为:分时调度和抢占式调度
分时调度就是,程序在调用CPU时,平均分配cpu的使用权。
抢占式调度:对于cpu的使用不再是均分,有一个优先级别,优先级的线程优先调用cpu,优先级别抢先使用cpu,是一个抢占式的过程,同时在使用的过程中cpu在多个线程的使用中来回高速切换,因为其高速运行,在我们看来就像是多个线程在同时运行,或者说是多个软件在同时运行的现象。

多线程的使用并不能提高程序的运行速度,但是可以提高cpu的使用率。
在使用时我们需要保证线程的安全。
死锁:在多线程的使用过程中,如果使用太大的卷积同步锁,在锁中圈套多个锁,就会引起程序的无限等待的现象,就会出现死锁。或者说,多个程序抢占资源,导致互相等待的过程。一般无外部的压力,不会发生任何变化。

那么我们需要如何来避免死锁的发生?:

这个写的特别全:
https://www.cnblogs.com/sthu/p/9660914.html
例子:
先看生活中的一个实例,2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个人都同时占用一个资源,等待另一个资源,这个时候甲在等待乙吃完并释放它占有的筷子,同理,乙也在等待甲吃完并释放它占有的筷子,这样就陷入了一个死循环,谁也无法继续吃饭。。。
在计算机系统中也存在类似的情况。例如,某计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。

在有些情况下死锁是可以避免的。三种用于避免死锁的技术:

加锁顺序(线程按照一定的顺序加锁)
加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
死锁检测

3、关于递归:
这里写的特别清楚的。
https://blog.****.net/sinat_38052999/article/details/73303111

4、python中字母的比较 :
大小字母小于小写字母 A<a
A<B 顺序在后面的字母越大

5、运算符的大小级别 :
从一级到十六级,一级表示优先级别最高

—— . ()
—— ++ - -
—— new
—— * / %
—— + -
—— >> << >>>
—— > < >= <=
—— == !=
—— &
—— ^
—— !
—— &&
—— ||
—— ? :
—— = += -= *= /= %= ^=
—— &= <<= >>=

6、对于二叉树的遍历问题:
三种遍历,先序和后序其实是一样的,要想确定二叉树的机构就需要确定中序和其余的一个。

7、对于堆
小顶堆和大顶堆的构建,以及如何进行堆排序。
已知小顶堆:{51,32,73,23,42,62,99,14,24,39,43,58,65,80,120},请问62对应节点的左子节点是
99
73
3943
120
解析:首先我们需要构建小顶堆
如何构建:http://wenku.cyjzzd.com/a/138698##wk-more

算法工程师-京东-知识点-刷题
8、对于计算子串的数目:
abcde
计算其子串的数目 就是计算连续的子串,再加上一个空集,子串的长度为:n(n+1)/2

例如:算法工程师-京东-知识点-刷题
解析:对于题目中出现了重复的字符,是否影响我们计算子串呢?还有,很明显字符串中有很多空格,空格怎么处理呢?
若字符串的长度为n,则子串的个数就是[n*(n+1)/2]+1个,重复的子串也考虑

9、计算二叉树的节点数
二叉树的计算:
算法工程师-京东-知识点-刷题

n个节点的二叉树总共有(2n!)/(n!*(n+1)!)种,4个节点有14种。

算法工程师-京东-知识点-刷题
解析:对于二叉树的节点的计算:
树的入度=树的出度=树的节点数-1
树的度=0n0+1n11+2n2+…Nnn=树的节点数-1=n0+n1+n2+n3+…nn-1
根据题目列出公式:
0n0+1*10+2n2=5+10+n2-1
得到n2=4

所以度数为=0+10+8=18

算法工程师-京东-知识点-刷题
解析:根据上面的计算公式:
n0=5
n1=3
n2
04+13+2*n2=5+3+n2-1
n2=4
节点总数为=12

10、对于排序算法:
算法工程师-京东-知识点-刷题
解析:首先我们看一下:
选择排序:https://www.cnblogs.com/jingmoxukong/p/4303289.html
每次选择最小的数字排在最前面

基数排序:https://blog.****.net/double_happiness/article/details/72452243

堆排序:http://wenku.cyjzzd.com/a/138698
这道题应该是:选择排序和堆排序