笔试记录(1):纯粹记录不含笔试公司

·迷失的时候,选择更加艰辛的那条路;·

可能是按照找到的资料进行记录;

  1. 静态链接库和动态链接库区别
    静态库里的代码在编译期就会嵌入可执行文件。动态库在程序运行时,动态加载到内存,或者按照需要,随时被加载到内存
  2. 设计模式的两大主题
    系统复用与系统扩展;
  3. 最长公共子序列使用的算法
    动态规划;
  4. CAP原则
    C:容错性;A:可用性;P:分区容错性;CAP不可能同时存在,也就是不可兼得,一般情况都会根据一些自身的因素进行选择,例如银行可能更加注重CP,毕竟不出错才是最重要的;
  5. Redis和ZooKeeper与CAP原则
    redis的话满足分区的原则,即P原则,至于C和A原则一般是C强A就弱,A强C就弱;很多博客确实说Zookeeper主要满足的是CP原则;引入 observer节点缓解节点可以缓解P的问题;可以看看篇论述ZooKeeper与CAP关系的文章
  6. 在TCP的四次挥手阶段TCP服务器第二次发出信息后的状态
    LAST-ACK;
  7. 进程间的通信方式
进程间的亲属关系主要是指父子进程关系;
1.管道(pipe):管道是一种半双工的通信方式;
2.命名管道(FIFO):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信 ;
3.消息队列(MessageQueue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识;
4.共享存储(SharedMemory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
5.信号量(Semaphore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问;
6.套接字(Socket):套接字;
7.信号(sinal):用于通知接收进程某个事件已经发生; 
  1. 二叉树的层序遍历,应该错了,但是也正常
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 +
                '}';
    }
}

这是第一篇,后续如果觉得还有需要记录的再说吧;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘的天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值