什么是线程池 线程池是一项程序开发人员以简单和有效的方式去利用现代处理器的并发性来榨取处理器性能的方法。简而言之,线程池通过对线程的有效管理,提高了CPU的并发性。一般的流程是,提交一项任务后,线程池分配线程在不阻塞主线程的情况下完成这项工作。并且,线程池并不是每提交一项任务初始化一次,而是一次初始化,保持非活跃状态直至一些任务完成。这样的话,也减小了系统开销。 线程池的原理示意图如下: 什么情况下需要使用线程池 有这样一个项目:公司需要为某某超市做一套对每天进入超市的顾客做用户画像的系统。基本流程是:对海康摄像头…

2021年3月23日 2条评论 532点热度 2人点赞 agedcat_xuanzai 阅读全文

什么是大端小端 所谓的大端小端就是数据对齐的端模式,也就是计算机中采用的两种常用的字节存储机制,与CPU相关。 小端: 低位字节(也就是数据)放在内存的低地址端,高位字节放在内存的高地址端。 大端: 高位字节(也就是数据)放在内存的低地址端,低位字节放在内存的高地址端。 举个例子: 0x123456在内存中是怎么存储的呢? 大端模式 低地址---------->高地址 0x12 | 0x34 | 0x56 小端模式 低地址---------->高地址 0x56 | 0x34 | 0x12 如何判断大端小…

2021年3月20日 0条评论 243点热度 3人点赞 agedcat_xuanzai 阅读全文

C++中引入内联函数的目的是为了提高程序运行速度而做的一项改进。 内联函数与常规函数之间的区别也不在编写方式,而在于C++编译器是怎么将他们组合到程序中的。为了更深层次的理解,我们需要首先了解一下函数代码是怎么发挥作用的。 代码要发挥作用,最终是要转化为可执行程序,也就是一组机器语言指令。在运行程序时,操作系统将这些指令加载到计算机内存中,从而实现了相关的功能。因此,每一条指令都必须有特定的内存地址。计算机将逐步执行这些指令。而存在函数调用的时候,将会使程序跳到另一个地址(函数的地址),并且在函数结束的时候返回。我…

2021年3月20日 0条评论 231点热度 0人点赞 agedcat_xuanzai 阅读全文

前两天面试的时候碰到了SQL查询命令,让查询综合成绩2到4名的学生学号,一下子蒙住了。 下来赶紧整理一下,发现mySQL好坑啊!!! 来一张可爱的猫咪图缓解一下郁闷的心情。 废话不多说。 首先给了一个很典型的学生成绩数据表: 成绩表: score(s_id,c_id,s_s_score) –学生编号,课程编号,分数 我们在数据库里面创建表并且写入数据: -- 1 创建表格 create table if not exists score ( s_id VARCHAR(20) not null, c_id VARCH…

2021年3月19日 0条评论 344点热度 1人点赞 agedcat_xuanzai 阅读全文

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。 特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,…

2021年3月14日 0条评论 196点热度 1人点赞 agedcat_xuanzai 阅读全文

题目描述 翻转一棵二叉树。 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 备注: 这个问题是受到 Max Howell 的 原问题 启发的 : 谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出>>翻转二叉树这道题,这太糟糕了。 这是永远的嘲讽啊!太狠了 解题思路 运用递归的思想,先将左子树和右子数递归翻转,然后将翻转后的左子树和右子树调换位置。递归出口就是根节点为空或者只有根节…

2021年3月14日 0条评论 310点热度 0人点赞 agedcat_xuanzai 阅读全文

题目描述 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 <--- / \ 2 3 <--- \ \ 5 4 <--- 解题思路 这道题是二叉树的右视图,也就是输出每一层的最后一个结点的值。所以在层序遍历的基础上加以改动就ok。 示例代码 vector<int> rightSideView(TreeNode* root) { vector<…

2021年3月14日 0条评论 242点热度 0人点赞 agedcat_xuanzai 阅读全文

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”  示例 示例 1: 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出:3 解释:节点 5 和节点 1 的最近公共祖先是节点 3 。 示例 2: 输入:root = [3,5,1,6,2,0,8,nu…

2021年3月14日 0条评论 282点热度 0人点赞 agedcat_xuanzai 阅读全文

题目描述 给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回锯齿形层序遍历如下: [ [3], [20,9], [15,7] ] 解题思路 这道题是二叉树层次遍历的变种,可以参照二叉树遍历大总结里面的层次遍历中的方法进行微改动。 由于我们已经加上了level来指示二叉树的层数,那么我们其实只要判断level为奇数的时候,将存储那一层…

2021年3月14日 0条评论 333点热度 0人点赞 agedcat_xuanzai 阅读全文

相关题目 No. 144 二叉树的前序遍历 No. 94 二叉树的中序遍历 No. 145 二叉树的后序遍历 No. 102 二叉树的层序遍历 解法总结 关于二叉树遍历的概念不再赘述,直接开始怼题目。 先对前序遍历、中序遍历和后序遍历做总结,层序遍历拎出来单独说。 关于二叉树的定义如下: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} T…

2021年3月14日 0条评论 409点热度 0人点赞 agedcat_xuanzai 阅读全文