<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[philamar的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/philamar</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; philamar]]></copyright><item><title><![CDATA[Thread Local存储]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/129269726</link><guid>https://blog.youkuaiyun.com/philamar/article/details/129269726</guid><author>philamar</author><pubDate>Tue, 28 Feb 2023 20:53:58 +0800</pubDate><description><![CDATA[c++11 关键字 Thread Local 简要总结]]></description><category></category></item><item><title><![CDATA[LeetCode416.分割相同子集]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/120102103</link><guid>https://blog.youkuaiyun.com/philamar/article/details/120102103</guid><author>philamar</author><pubDate>Sat, 04 Sep 2021 17:10:59 +0800</pubDate><description><![CDATA[LeetCode416.分割等和子集
相似题目

难易程度

middle

题目考察

回溯
动态规划

暴力解法
思路及算法：最容易想到的方法是用回溯法暴力搜索所有答案，使用二维数组res保存结果，path保存找到的一个数组。
//时间复杂度：O(N * 2^ N) 空间复杂度：O(N * M)
#include&lt;iostream&gt;
#include&lt;vector&gt;
#include&lt;algorithm&gt;

using namespace std;

class So]]></description><category></category></item><item><title><![CDATA[虚拟内存简单总结]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119957716</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119957716</guid><author>philamar</author><pubDate>Fri, 27 Aug 2021 17:48:41 +0800</pubDate><description><![CDATA[虚拟内存
为什么要建立虚拟内存

为了防止不同进程同一时刻在物理内存中运行而对物理内存抢夺，采用了虚拟内存。虚拟内存技术使得不同进程在运行过程中，所看到得是自己占有了当前系统得4G内存。所有进程共享同一物理内存，每个进程只把自己目前所需要得虚拟内存通过文件管理单元映射到物理内存上。事实上，虚拟内存对应位置的程序没有立即映射到物理内存上，只是建立好虚拟内存和磁盘文件之间的映射（存储器映射），等到运行到对应的程序时，才会通过缺页异常，来拷贝数据。还有进程运行过程中，要动态分配内存，比如malloc时，也只是分配]]></description><category></category></item><item><title><![CDATA[在编译环境下的数组定义总结]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119856802</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119856802</guid><author>philamar</author><pubDate>Sun, 22 Aug 2021 20:06:57 +0800</pubDate><description><![CDATA[编译
vector可以在编译环境下怎么定义，怎么定义一维数组，定义二维数组，这些问题可以总结一下
vector定义一维数组
int main() {
    int a[] = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
    vector&lt;int&gt; cost(a, a + sizeof(a) / sizeof(int));
    Solution solution;
    cout &lt;&lt; solution.minCostClimbingStai]]></description><category></category></item><item><title><![CDATA[leetcode 222.完全二叉树的节点个数]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119849532</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119849532</guid><author>philamar</author><pubDate>Sun, 22 Aug 2021 10:54:34 +0800</pubDate><description><![CDATA[文章初心
笔者是应届生，二叉树的遍历以及二叉树的属性等对于面试来说，显得尤为重要，今天用一道题来巩固二叉树的遍历和二叉树的属性的知识。

难易程度

middle

题目考察

二叉树的遍历
递归调用
栈的使用
满二叉树的性质

深度优先遍历（后序遍历）
思路：先递归左子树的节点个数，再递归右子树的节点个数，最后返回左右子树节点个数 + 1（根节点自身）
//时间复杂度O(nlogn)   空间复杂度O(n)
class Solution {
public:
    int getNum(TreeNode*]]></description><category></category></item><item><title><![CDATA[leetcode102.二叉树的层序遍历]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119815452</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119815452</guid><author>philamar</author><pubDate>Fri, 20 Aug 2021 09:11:40 +0800</pubDate><description><![CDATA[leetcode102.二叉树的层序遍历
文章初心
笔者是应届生，二叉树的遍历对于面试来说，显得尤为重要，故今天总结一个层序遍历版本，希望能举一反三。
相关题型：

leetcode 107.二叉树的层序遍历||
leetcode 109.二叉树的右视图
leetcode 637. 二叉树的层平均值
leetcode 429.N叉树的层序遍历
leetcode 515.在每个树行中找最大值
leetcode 116.填充每个节点的下一个右侧节点指针
leetcode 117.填充每个节点的下一个右侧节点指针]]></description><category></category></item><item><title><![CDATA[leetcode 94.二叉树的中序遍历]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119795091</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119795091</guid><author>philamar</author><pubDate>Thu, 19 Aug 2021 10:10:11 +0800</pubDate><description><![CDATA[文章初心
笔者是应届生，二叉树的遍历对于面试来说，显得尤为重要，故今天总结一个递归版本。
相关题型：

leetcode 144.二叉树的前序遍历
leetcode 145. 二叉树的后序遍历


难易程度

easy

题目考察

二叉树的遍历
递归调用

递归解法
思路：定义返回值参数类型，确定终止条件，递归左子树，再插入根节点值，递归右子树，最终返回结果数组
class Solution {
public:
    vector&lt;int&gt; inorderTraversal(TreeNode]]></description><category></category></item><item><title><![CDATA[leetcode 145. 二叉树的后序遍历]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119795273</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119795273</guid><author>philamar</author><pubDate>Thu, 19 Aug 2021 10:09:10 +0800</pubDate><description><![CDATA[文章初心
笔者是应届生，二叉树的遍历对于面试来说，显得尤为重要，故今天总结一个递归版本。
相关题型：

leetcode 144. 二叉树的前序遍历
leetcode 94. 二叉树的中序遍历


难易程度

easy

题目考察

二叉树的遍历
递归调用

递归解法
思路：定义返回值参数类型，确定终止条件，递归左子树，递归右子树，再插入根节点值，最终返回结果数组
class Solution {
public:

    void traversal(TreeNode* cur, vector&lt;in]]></description><category></category></item><item><title><![CDATA[leetcode 144. 二叉树的前序遍历]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119794693</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119794693</guid><author>philamar</author><pubDate>Thu, 19 Aug 2021 09:50:41 +0800</pubDate><description><![CDATA[文章初心
笔者是应届生，二叉树的遍历对于面试来说，显得尤为重要，故今天总结一个递归版本。
相关题型：
145. 二叉树的后序遍历
94. 二叉树的中序遍历
144.二叉树的前序遍历

难易程度

easy

题目考察

二叉树的遍历
递归调用

递归解法
思路：定义返回值参数类型，确定终止条件，先根节点，再递归左子树，递归右子树，最终返回结果数组
class Solution {
public:
    vector&lt;int&gt; preorderTraversal(TreeNode* root) ]]></description><category></category></item><item><title><![CDATA[LeetCode844.比较含退格的字符串]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119775236</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119775236</guid><author>philamar</author><pubDate>Wed, 18 Aug 2021 11:03:58 +0800</pubDate><description><![CDATA[LeetCode844.比较含退格的字符串
相似题目

leetcode283.移动零


难易程度

easy

题目考察

栈的使用
双指针
数组元素的移动

暴力解法
思路及算法：最容易想到的方法是将给定的字符串中的退格符和应当被删除的字符都去除，还原给定字符串的一般形式。然后直接比较两字符串是否相等即可。用栈处理遍历过程，每次我们遍历到一个字符：如果它是退格符，那么我们将栈顶弹出；如果它是普通字符，那么我们将其压入栈中
//时间复杂度：O(N+M) 空间复杂度：O(N+M)O(N+M)
class ]]></description><category></category></item><item><title><![CDATA[LeetCode 283.移动零]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119773404</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119773404</guid><author>philamar</author><pubDate>Wed, 18 Aug 2021 10:01:15 +0800</pubDate><description><![CDATA[难易程度
考察点
暴力解法
优化解法]]></description><category></category></item><item><title><![CDATA[LeetCode中的代码如何在本地编译器编译成功]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119752087</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119752087</guid><author>philamar</author><pubDate>Tue, 17 Aug 2021 11:37:11 +0800</pubDate><description><![CDATA[文章初心

笔者是应届生，现在的面试都不仅是核心代码模式，很多公司开始考察ACM模式，而在leetcode刷题时，都是核心代码模式，我相信很多同学像我一样，就没怎么接触过ACM模式，假如没接触ACM模式，面试中，很可能惊慌失措，接下来我将简单的介绍一下在编译器编译代码。

头文件
ACM模式首先就是自己写头文件，以下是经常要用到的头文件。


#include&lt; cstdio &gt;
在C++中拥有在C语言里一样的语法，像输入输出。


#include&lt;  cstring &gt;
包含很多]]></description><category></category></item><item><title><![CDATA[内核态与用户态的理解]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119113402</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119113402</guid><author>philamar</author><pubDate>Mon, 26 Jul 2021 17:14:08 +0800</pubDate><description><![CDATA[内核态和用户态之间的区别
 用户态和内核态是操作系统的两种运行级别，两者最大的区别就是特权级别不同。用户态拥有最低的特权级，内核态拥有较高的特权级。运行再拥护态的程序不能直接访问操作系统内核数据结构和程序。

用户态到内核态的转化原理


用户态切换到内核态的3种方式
1.系统调用



这是用户态主动要求切换到内核态的一种方式，用户进程通过系统调用申请操作系统提供的服务程序完成工作。而系统调用的机制核心还是使用了操作系统为用户特别开放的一个中断来实现，例如Linux的ine 80h中断。
	2. 异常

]]></description><category></category></item><item><title><![CDATA[netstat命令详解]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/119111265</link><guid>https://blog.youkuaiyun.com/philamar/article/details/119111265</guid><author>philamar</author><pubDate>Mon, 26 Jul 2021 15:47:59 +0800</pubDate><description><![CDATA[netstat命令是一个监控TCP/IP网络的非常有用的工具，它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。
语法：
netstat [选项]
参数：
-a或–all：显示所有连线中的Socket；
-A&lt;网络类型&gt;或–&lt;网络类型&gt;：列出该网络类型连线中的相关地址；
-c或–continuous：持续列出网络状态；
-C或–cache：显示路由器配置的快取信息；
-e或–extend：显示网络其他相关信息；
-F或–fib：显示FIB；
-g或–groups：显示]]></description><category></category></item><item><title><![CDATA[索引本质总结]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/118680569</link><guid>https://blog.youkuaiyun.com/philamar/article/details/118680569</guid><author>philamar</author><pubDate>Mon, 12 Jul 2021 18:19:51 +0800</pubDate><description><![CDATA[索引的本质
索引是帮助MySQL高效获取数据的排好序的数据结构
既然索引是种数据结构，那么其底层是什么数据结构呢？其实可以归纳为四种数据结构。

二叉树
红黑树
Hash表
B-Tree
B+Tree

二叉树

容易造成链表，查询效率特别低


红黑树

大数据量时，树的深度太深，导致查询效率很慢


Hash

对索引的key进行一次hash计算就可以定位出数据存储的位置
很多时候Hash索引要比B+树索引更高效
仅能满足 “=” ， “IN” ， 不支持范围查询
hash冲突问题


B-Tree

]]></description><category></category></item><item><title><![CDATA[数据库索引总结]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/118679722</link><guid>https://blog.youkuaiyun.com/philamar/article/details/118679722</guid><author>philamar</author><pubDate>Mon, 12 Jul 2021 17:44:39 +0800</pubDate><description><![CDATA[什么是索引？

索引是对数据库表中一列或多列的值进行排序的一种结构，使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓名来查找他或她，则与在表中搜索所有的行相比，索引有助于更快地获取信息。讲了这么多，其实索引就是一种排好序的数据结构。

索引有什么作用？

索引的主要目的就是加快检索表中数据的方法，亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。

索引有什么优点？

通过创建唯一性索引，可以保证数据库表中每一行数据的唯一性。
可以大大加快数据的检索速度，这也是创建索引的主要原]]></description><category></category></item><item><title><![CDATA[归并排序总结]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/117968208</link><guid>https://blog.youkuaiyun.com/philamar/article/details/117968208</guid><author>philamar</author><pubDate>Sun, 04 Jul 2021 19:23:31 +0800</pubDate><description><![CDATA[归并排序原理
将一个大的无序数组有序，我们可以把大的数组分成两个，然后对这两个数组分别进行排序，之后在把这两个数组合并成一个有序的数组。由于两个小的数组都是有序的，所以在合并的时候是很快的。
通过递归的方式将大的数组一直分割，直到数组的大小为 1，此时只有一个元素，那么该数组就是有序的了，之后再把两个数组大小为1的合并成一个大小为2的，再把两个大小为2的合并成4的 … 直到全部小的数组合并起来。
可以用动图描述为：

思想总结为：


把长度为n的输入序列分成两个长度为n/2的子序列；


对这两个子序列分]]></description><category></category></item><item><title><![CDATA[剑指offer 29.顺时针打印矩阵总结]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/118244534</link><guid>https://blog.youkuaiyun.com/philamar/article/details/118244534</guid><author>philamar</author><pubDate>Sat, 26 Jun 2021 11:34:31 +0800</pubDate><description><![CDATA[题目：输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。
解题思路：
根据题目示例 matrix = [[1,2,3],[4,5,6],[7,8,9]] 的对应输出[1,2,3,6,9,8,7,4,5] 可以发现，顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。

算法流程：


空值处理： 当 matrix 为空时，直接返回空列表 [] 即可。


初始化： 定义向右，向下，向左， 向右四个方向坐标变换值， 用于打印的结果列表 res 。


循环打印： “从左向右、]]></description><category></category></item><item><title><![CDATA[冒泡排序总结]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/117958259</link><guid>https://blog.youkuaiyun.com/philamar/article/details/117958259</guid><author>philamar</author><pubDate>Wed, 16 Jun 2021 15:10:13 +0800</pubDate><description><![CDATA[原理
冒泡排序就是把小的元素往前调或者把大的元素往后调，比较是相邻的两个元素比较，交换也发生在这两个元素之间。
所以，如果两个元素相等，我想你是不会再无聊地把他们俩交换一下的；如果两个相等的元素没有相邻，那么即使通过前面的两两交换把两个相邻起来，这时候也不会交换，所以相同元素的前后顺序并没有改变，所以冒泡排序是一种稳定排序算法。
可用动图描述为：


比较相邻的元素。如果第一个比第二个大，就交换他们两个。
对每一对相邻元素作同样的工作，从开始第一对到结尾的最后一对。这步做完后，最后的元素会是最大的数。
针对]]></description><category></category></item><item><title><![CDATA[STL中list与queue之间的区别]]></title><link>https://blog.youkuaiyun.com/philamar/article/details/117934265</link><guid>https://blog.youkuaiyun.com/philamar/article/details/117934265</guid><author>philamar</author><pubDate>Tue, 15 Jun 2021 22:07:47 +0800</pubDate><description><![CDATA[STL中list与queue之间的区别


list不再能够像vector一样以普通指针作为迭代器，因为其节点不保证在存储空间中连续存在；


list插入操作和结合才做都不会造成原有的list迭代器失效;


list不仅是一个双向链表，而且还是一个环状双向链表，所以它只需要一个指针；


list不像vector那样有可能在空间不足时做重新配置、数据移动的操作，所以插入前的所有迭代器在插入操作之后都仍然有效；


deque是一种双向开口的连续线性空间，所谓双向开口，意思是可以在头尾两端分别做元素的插入]]></description><category></category></item></channel></rss>