• 2021春招冲刺-1221 进程与线程的区别 | 进程的切换 | 单链表是否相交 | 元素水平/垂直居中的方式


    2021春招冲刺

    12.21日

    1.操作系统 | 进程与线程之间的区别

    在12.17日的回答中已经提及,此处搬运,蓝色部分为看了邹大佬博客的补充。

    线程与进程的区别

    • 并发性
      在引入线程的os系统中,不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
    • 调度
      • 线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
      • 在同一个进程内线程切换不会产生进程切换,由一个进程内的线程切换到另一个进程内的线程时,将会引起进程切换
    • 资源开销
      进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源,即一个进程的所有资源可供进程内的所有线程共享。
    • 内存分配
      同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
    • 独立性
      每个独立的进程有程序运行的入口、顺序执行序列和程序出口,但是线程不能独立执行。
    • 系统开销:
      • 进程创建和撤消的开销远大于线程创建和撤消的开销。
        进程切换时,当前进程的CPU环境要保存,新进程的CPU环境要设置。线程切换时只须保存和设置少量寄存器,并不涉及存储管理方面的操作
      • 同一进程内的各线程由于它们拥有相同的地址空间,它们之间的同步和通信的实现也比较容易

    • 目的:
      • 进程:为了使多个程序更好的并发执行,改善资源利用率、提高系统效率
      • 线程:为了减少并发执行时所付出的时空开销,使并发粒度更细、并发性更好

    2.操作系统 | 进程之间如何切换

    进程的三种状态

    • 运行态:占用CPU且正在CPU上运行
    • 就绪态:已具备运行条件,但CPU没有空闲
    • 阻塞态:因等待某一事件而不能运行

    转换条件


    3.算法 | 如何判断两个单链表是否相交。返回相交的第一个节点,否则返回null

    救命,看见算法就直接遁地

    双指针方法

    使用两个指针pA,pB分别从AB两个链表的头部开始遍历,如果一个到了尾部的话就转到另一个链表的头部。
    如果两个链表有交点的话,由于两个指针都需要走A的长度+B的长度,因此一定会有相遇的点。如果A、B长度相等,那么第一次遍历的时候就可以相遇。如果A、B长度不相等,那么第二次遍历的时候也一定会相遇。
    如果两个链表无焦点除非A、B为空,否则pA、pB不会相遇。

    class Solution {
    public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(headA==NULL || headB==NULL) return NULL;
    
        ListNode *pA = headA,*pB = headB;
        while(pA!=pB)
        {
            pA = pA==NULL ? headB : pA->next;
            pB = pB==NULL ? headA : pB->next;
        }
        return pA;
    }
    

    };

    暴力解法

    每次移动A的节点的时候都重新遍历B查看有无相交的节点

    哈希表

    原理是首先遍历A,记录A每个节点的位置,再遍历B,记录B每个节点遍历的位置,如果B的节点已经记录过,则代表该点已经被访问过,即为AB的交点。

    class Solution {
    public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        
        std::unordered_set<ListNode*> set;
    
        ListNode* pA = headA;
        while (pA)
        {
            set.insert(pA);
            pA =pA ->next;
        }
    
        ListNode* pB = headB;
        while (pB)
        {
            if(set.find(pB) != set.end()) //找到了
            {
                return pB;
            }
            pB = pB->next;
        }
    
        return nullptr;
    }
    };
    

    4.css | 子元素水平/垂直居中的方式有哪些

    <div id="parent">
         <div id="child">child</div>
    </div>
    

    水平居中

    • margin: 0 auto;如果设置了 float:left浮动则会失效!
    • 根据子元素的width,在父元素设置 position: relative ,子元素设置 position: absolute;left: 50%; 基础上设置 margin-left:-child宽度/2 的偏移。
    • 在和上一点同样的定位基础上,使用transform:translate(50%,0);进行位置偏移,原理和第点一样,但是不需要知道子元素的宽度。
    • flex布局 父元素设置 display:flex; justify-content: center;
    • 设置父元素 text-align:center; 并设置子元素为内联元素 display:inline-block同样设置了浮动会失效,如果设置的display:inline ,则子元素高度失效

    垂直居中

    • margin: auto 0;
    • 根据子元素的height,在父元素设置position: relative ,子元素设置 position: absolute;top: 50% ;基础上设置 margin-top:-child高度/2 的偏移。
    • 在和上一点同样的定位基础上,使用transform:translate(0,50%);进行高度偏移设置相对位置的时候不会释放子元素的高度,而如果设置position:absolute 则会释放子元素的高度
    • flex布局1: 父元素设置 display:flex; flex-direction:column; 并设置justify-content:center;定义轴方向为y轴
    • flex布局2: 父元素设置 display:flex; align-items: center;
    • 设置父元素 vertical-align: middle;display:table-cell;会让所有子元素都居中显示
  • 相关阅读:
    取消chrome(谷歌浏览器)浏览器下最小字体限制
    函数声明方式及作为值的函数
    常用的正则表达式
    8腾讯云服务器账号密码
    errno -4058 and npm WARN enoent ENOENT 解决方案
    node gyp的问题
    npm 版本问题
    无缘无故出现npm 解析异常的的问题 解决方案
    idea注册码
    以太坊测试网络 账号密码
  • 原文地址:https://www.cnblogs.com/banshanliang/p/14186373.html
Copyright © 2020-2023  润新知