·迷失的时候,选择更加艰辛的那条路;·
可能是按照找到的资料进行记录;
- 静态链接库和动态链接库区别
静态库里的代码在编译期就会嵌入可执行文件。动态库在程序运行时,动态加载到内存,或者按照需要,随时被加载到内存
; - 设计模式的两大主题
系统复用与系统扩展;
- 最长公共子序列使用的算法
动态规划;
- CAP原则
C:容错性;A:可用性;P:分区容错性;CAP不可能同时存在,也就是不可兼得,一般情况都会根据一些自身的因素进行选择,例如银行可能更加注重CP,毕竟不出错才是最重要的;
- Redis和ZooKeeper与CAP原则
redis的话满足分区的原则,即P原则,至于C和A原则一般是C强A就弱,A强C就弱;很多博客确实说Zookeeper主要满足的是CP原则;引入 observer节点缓解节点可以缓解P的问题;
可以看看篇论述ZooKeeper与CAP关系的文章; - 在TCP的四次挥手阶段TCP服务器第二次发出信息后的状态
LAST-ACK;
- 进程间的通信方式
进程间的亲属关系主要是指父子进程关系;
1.管道(pipe):管道是一种半双工的通信方式;
2.命名管道(FIFO):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信 ;
3.消息队列(MessageQueue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识;
4.共享存储(SharedMemory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
5.信号量(Semaphore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问;
6.套接字(Socket):套接字;
7.信号(sinal):用于通知接收进程某个事件已经发生;
- 二叉树的层序遍历,应该错了,但是也正常
public class TreeLayer {
public List selectTree(Node root){
/*
* 简单定义一下思路;
* 首先很明显需要一层一层的取数据,那么最好是要一个动态数组;
* 然后常规方法是使用一个队列,对节点进行存储,这样每一次都只是存入一层节点然后取出;并将相应数据放入到动态数组;
* 最后将这些操作放在循环里面进行,知道队列里面没有任何的节点;跳出循环;
* */
//先判断根节点是否为null;
if(root==null) return null;
//定义一个动态数组;
List<List<Integer>> list = new ArrayList();
//定义一个队列;实际上linkedlist也实现了队列;
Queue<Node> queue = new LinkedList<>();
//将第一个根节点放入;
queue.add(root);
while(queue.size()!=0) {//除非队列中完全没有数据;
int length = queue.size();//定义一个队列的长度,保证每次跑完都会重新开始;
List<Integer> temp = new ArrayList<>();//定义一个临时的动态数组,专门存储每一层的数据;
System.out.println("最外围的temp数据:"+temp.toString());
for (int i = 0; i < length; i++) {//定义一个for循环;
Node poll = queue.poll();//取出队列中最前面的节点;
System.out.println(poll.toString()+"当前的数组大小"+queue.size());
temp.add(poll.val);//将取到的值放入临时数组;
System.out.println(temp.toString());
//判断左子树是否为空;
if(poll.left!=null){
queue.add(poll.left);//放入左子树
}
if(poll.right!=null){
queue.add(poll.right);
}
}
//每一个for循环都会循环一层,那么将循环得到的数据放入到相应的动态数组里;
list.add(temp);
}
return list;
}
public static void main(String[] args) {
Node n1 = new Node(2);
Node n2 = new Node(3);
Node n3 = new Node(5);
Node n4 = new Node(7);
n1.left = n2;
n1.right = n3;
n3.left = n4;
List list = new TreeLayer().selectTree(n1);
System.out.println(list.toString());
}
}
class Node {
int val;//定义数据
Node left;//定义左子节点
Node right;//定义右子节点
public Node(int val) {
this.val = val;
}
@Override
public String toString() {
return "Node{" +
"val=" + val +
", left=" + left +
", right=" + right +
'}';
}
}
这是第一篇,后续如果觉得还有需要记录的再说吧;