自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(108)
  • 收藏
  • 关注

原创 面试题八股文之算法题

面试

2022-07-18 17:54:08 559

原创 面试八股文补充之网络操作系统数据库

面试

2022-07-18 10:53:07 414

原创 面试题八股文之C++补充

面试题:

2022-07-07 08:24:54 401

原创 手撕力扣之动态规划4:让字符串成为回文串的最少插入次数

动态规划

2022-06-04 16:28:27 236

原创 手撕力扣之链表2:奇偶链表、排序奇升偶降链表

力扣328. 奇偶链表给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。class Solution {public: ListNode* oddEvenList(ListNode* head) { if (head == nullptr) { return head; } ListNode* evenHead = head->ne

2022-01-11 06:57:45 576

原创 手撕力扣之图论:课程表、课程表 II、省份数量、等式方程的可满足性、情侣牵手、 实现 Trie (前缀树)、数组中两个数的最大异或值、判断二分图

力扣210. 课程表 II现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]。给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。思路:我们使用一个队列来进行广度优先搜索。开始时,所有入度为 00 的节点都被放入队列中,它们就是可以作为拓扑排序最前面的节点,并且它

2021-08-19 15:05:32 315

转载 手撕力扣之哈希法.下:最长连续序列、LRU 缓存机制、 LFU 缓存、连续的子数组和

力扣128. 最长连续序列给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。思路:由于我们要枚举的数 x 一定是在数组中不存在前驱数 x−1 的,不然按照上面的分析我们会从 x−1 开始尝试匹配,因此我们每次在哈希表中检查是否存在 x−1 即能判断是否需要跳过了。class Solution {public: int longestConsecutive(vector<int>& nums) { unor

2021-05-13 10:57:53 169

原创 手撕力扣之数学题:用 Rand7() 实现 Rand10()、会议室 II、对角线遍历I和II、可怜的小猪、数据流的中位数

力扣470. 用 Rand7() 实现 Rand10()腾讯面试高频题。定理:若rand_n()能等概率生成1到n的随机整数,则有(rand_n() - 1) * n + rand_n()能   等概率生成1到n * n的随机整数。解释: rand()7能等概率生成1~7,   rand7() - 1能等概率生成0~6,   (rand7() - 1) * 7能等概率生成{0, 7, 14, 21, 28, 35, 42},   (rand7() - 1) * 7 + rand7()能等概率生

2021-04-24 09:59:16 188

原创 手撕力扣之栈:下一个更大元素 I、下一个更大元素 II、132 模式、和至少为 K 的最短子数组

力扣042. 接雨水给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。int trap(vector<int>& height){ if (height == null) return 0; int ans = 0; int size = height.size(); vector<int> left_max(size), right_max(size); left_

2021-04-07 15:06:46 143

转载 手撕力扣之动态规划:最长公共子序列、杨辉三角、接雨水、字符串相乘、解码方法、把数字翻译成字符串、正则表达式匹配、通配符匹配、最大子矩阵、不同路径 II、最长回文子序列、下降路径最小和、圆环回原点问题

力扣1143. 最长公共子序列给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。思路:class Solution {p

2021-03-08 14:09:27 393

原创 手撕力扣之dfs(树):完全二叉树的节点个数、求根到叶子节点数字之和、二叉树中的最大路径和、打家劫舍III、二叉树的序列化与反序列化、二叉树中所有距离为K的结点

力扣222. 完全二叉树的节点个数给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^h 个节点。思路:class Solution {public: int depth(TreeNode* root) { int ans=0; while(root

2021-02-24 12:04:24 314

转载 手撕力扣之双指针(字符串、数组):比较版本号、长度最小的子数组、最小覆盖子串、 有序数组的平方、压缩字符串、有效三角形的个数、区间列表的交集、无重叠区间、最小区间、反转字符串中的单词 III

力扣165. 比较版本号给你两个版本号 version1 和 version2 ,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个 ‘.’ 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订

2021-02-03 16:43:39 420

原创 手撕力扣之dfs(非二叉树):括号生成、单词搜索、复原IP地址、二叉搜索树的后序遍历序列、矩阵中的最长递增路径、岛屿数量、岛屿的最大面积、至少有 K 个重复字符的最长子串

力扣337. 打家劫舍 III在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。思路:和打家劫舍I一样,不能选择相邻的两个节点。所以对于一个子树来说,有两种情况:包含当前根节点不包含当前根节

2021-01-09 22:09:36 338

原创 手撕力扣之排序:排序数组、数组中的逆序对、排序链表、最小的k个数、数组中的第K个最大元素、前 K 个高频元素、根据身高重建队列、最大数、下一个排列、下一个更大元素 III、最大交换、字典序的第K小数字

力扣剑指 Offer 40. 最小的k个数输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { //最大堆:就是由大到小 priority_queue<int> max_Heap;

2020-12-12 15:35:15 435

转载 手撕力扣之数学题:整数反转、回文数、Excel表列序号、阶乘后的零、各位相加、自除数、分糖果 II、3的幂、Nim 游戏、1比特与2比特字符、圆圈中最后剩下的数字、三个数的最大乘积、有效的正方形

力扣258. 各位相加给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。class Solution {public: int addDigits(int num) { while (num > 9) { int sum = 0; while (num) { int tmp = num % 10; su

2020-12-10 20:32:12 417

原创 C++线程安全的单例模式(局部静态变量改进的懒汉式,饿汉式)

单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性。单例模式可以分为懒汉式和饿汉式,两者之间的区别在于创建实例的时间不同:懒汉式:指系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。(这种方式要考虑线程安全)饿汉式:指系统一运行,就初始化创建实例,当需要时,直接调用即可。(本身就线程安全,没有多线程的问题)1.普通懒汉式(线程不安全)/// 普通懒汉式实现 -- 线程不安全 //#include <iostream> // std::

2020-12-09 14:49:37 1894

原创 进程调度之优先级反转问题

实时操作系统(Real-time operating system, RTOS)是说,任务切换和中断响应的时间必须保证在多少时间内(如5us内)完成。分为硬实时和软实操作系统:硬实时是说必须在多少时间内完成切换(如VxWorks, 我们使用的ecos也是硬实时的)软实时则是绝大多数情况可以在多少时间内完成切换(如linux)从原理来看判断一个系统是否是实时只需要看它的调度算法即可,具体能实时在多少时间内,则要区分不同硬件了。为什么需要实时操作系统呢?举一个经常使用的实例,中高档汽车中使用的气囊。

2020-12-08 14:06:06 553

原创 手撕力扣之二分(下篇):x 的平方根、寻找峰值、寻找两个正序数组的中位数、山脉数组中查找目标值、最长递增子序列、俄罗斯套娃信封问题、分割数组的最大值

力扣162. 寻找峰值峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。思路:为什么二分查找大的那一半一定会有峰值呢?(即nums[mid]<nums[mid+1]时,mid+1~N一定存在峰值) 我的理解是,首先已知 nums[mid+1]>nums[mid],那么mid+

2020-12-07 20:32:37 395

原创 TCP IP网络编程入门

网络编程总体轮廓:1.

2020-11-20 11:59:22 212

原创 手撕力扣之位运算:两整数之和、只出现一次的数字(I、 II)、丢失的数字、汉明距离、数字的补数、二进制中1的个数、Pow(x, n)、数组中数字出现的次数、数组中数字出现的次数 II、求1+2+…+n

力扣136. 只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。1.交换律:a ^ b ^ c <=> a ^ c ^ b2.任何数于0异或为任何数 0 ^ n => n3.相同的数异或为0: n ^ n => 0class Solution {public: int singleNumber(vector<int>& nums) { int res=0;

2020-11-19 20:18:57 284

原创 手撕力扣之双指针【链表数组】:删除链表的倒数第N个节点、链表中倒数第k个节点、分隔链表、环形链表I、II、寻找重复数、颜色分类、最短无序连续子数组、和为s的连续正数序列、翻转字符串里的单词、验证回文串

力扣019. 删除链表的倒数第N个节点class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* dummyHead = new ListNode(0); dummyHead->next = head; ListNode* slow = dummyHead; ListNode* fast = dummyHead;

2020-11-18 21:23:55 354

原创 侯捷C++ STL体系结构与源码剖析:关于moveable的说明

vector体积二倍增长,需要挪到另外一个空间进行构造,所以虽然insert进行300万次,而构造的动作有700多万次。list一个萝卜一个坑,所以构造的次数和insert一样。一个一个节点式的容器在时间花费上差不多,只有vector例外。move的工作和浅拷贝的原理差不多。传进去的参数是reference_by_reference。copy版本会真的分配,而move版本只是拷贝指针。...

2020-11-15 21:57:18 422

原创 侯捷C++ stl体系结构与源码剖析:traits(萃取器)的实例及底层实现

G2.9版本,这个版本实用性不高。trivial是不重要的意思,回答是false,默认都是重要的。要是不赞成这样,可以特化,比如来特化int类型。自己的类型要自己定义重要不重要。typedef都是来回答问题的。一般重要是存在指针的场合,防止系统默认进行一些浅拷贝,这个时候可以令拷贝构造变成重要的,就是不采用系统默认的拷贝构造。C++11版本:现在的版本不用自己申明重要不重要,系统自己考虑。测试程序:来回答问题。string的测试:注意回答是1的部分。Foo类中只有数据,没有函数,所以和以

2020-11-15 11:00:43 309

原创 侯捷C++ stl体系结构与源码剖析:tuple底层实现详解(递归继承)

tuple,一堆东西的组,元组。它可以指定任意的元素,任意的类型,形成一个结构体。注意下面tuple的声明和定义,用法。make_tuple可以直接把值放进去,类型编译器会实参推导。tuple还可以比较大小,如果是同一类型就逐一比较。tie(i1,f1,s1)=t3是将t3的元素都拿出来,然后附着到那三个变量上,连续赋值。还能够使用tuple_element<1,TupleType>::type拿出1号元素的类型出来。底层实现:用到了可变参数模板。可变参数模板都是一个主题加一个终止,来

2020-11-15 09:53:06 545

原创 侯捷C++ stl体系结构与源码剖析:一个万能的hash function

为一个类,构建一个Hash Function。有两个办法,一是设计为成员函数,但是为了调用成为函数对象,需要重载operator();二是设计成普通函数。第二种方法中,<>中第二个模板参数是函数类型,创建时还要将真正的函数地址放进来。将各种基本元素类型的hash组合起来,std::hash< std::string>()是一个对象,可以当函数来使用。typename… Types任意多的模板参数,可变参数模板。函数1和函数2,函数3的区别是第一个模板参数的类型不一样,虽然同名函

2020-11-14 16:46:47 337

原创 侯捷C++ STL体系结构与源码剖析:迭代器适配器详解,reverse_iterator,inserter,ostream_iterator,istream_iterator

迭代器适配器:为了修饰迭代器那么内部需要一个迭代器,即current。关键部分:current不能改变.reference operator*() const { Iterator tmp=current; return *--temp;}

2020-11-13 23:23:40 141

原创 侯捷C++ stl体系结构与源码剖析:函数适配器详解,C++11新特性bind

函数适配器,是去修饰函数,然后还要表现出函数的性质。所以最终还是要重载(),以表现出函数。binder2nd来绑定第二个参数,之前less是x<y,现在是x<40。less< int>()是创建了一个函数对象,不是调用。bind2nd调用了binder2nd,那么最终的效果是less< int>()传进去变成op,40传进去变成value。bind2nd调用过程,重点: 当执行pred(*first)调用的是operator()这个小括号重载函数,才真正调用了le

2020-11-13 22:24:43 194

原创 侯捷C++STL体系结构与源码剖析:标准库的算法实例

accumulate函数:第一个版本是累加,第二个版本是累计某个操作。()叫做function call operator,函数调用操作符,我们要传进去能调用()的东西。可被调用的东西,包括一般的函数myfunc,或者function object函数对象,它是一个类或者结构体,并重载小括号()所产生的对象。其实函数对象就是仿函数。for_each:一个区间里,对每一个元素做一件事情。replace,replace_if,replace_copy:元素如果等于旧值那么就被取代为新值;if就代表传一个

2020-11-12 23:06:26 207

原创 侯捷C++ STL体系结构与源码剖析:迭代器对算法的影响

distance函数,要看传入迭代器的类型,如果是连续空间直接相减,否则只能++。萃取器iterator_traits要根据输入迭代器类型来确定返回类型。加入last和first相差100万,则第二个直接一减就出来,而第一个要走100万步。向上继承,调用最匹配的父类。假设传入的是farward_iterator_tag类型,则调用input_iterator_tag。再来一个栗子:copy函数:源端需要起点终点,而目的端只需要起点。这里主要是为了实现加速,才那么多特化。for-loop是最慢的,从来

2020-11-12 22:09:54 114

原创 侯捷C++STL体系结构与源码剖析:cout的底层原理剖析

cout是一个ostream类对象extern表示这个文件之外也能用cout。重载了很多类型,operator<<。这些都是常见的类型。要不是基本的类型,需要在自己定义的类中,进行操作符重载operator<<。这是标准库里的,粉红色的那些类型都是我们可以直接拿来cout的,但是都是在各自的类重新进行操作符重载了。比如complex复数的输出,就是在自己的类中重新定义,输出格式:<实部,虚部>...

2020-11-11 20:30:03 767

原创 侯捷C++STL体系结构与源码剖析:适配器原理大解剖

适配器,改造器更为贴切。换肤工程,小变化。出现在三个地方,仿函数、容器、迭代器的适配器。为了实现一个桥梁的作用,就是A代替B给大家使用,但是底层是A调用B。这里的关系是复合(拥有的关系),不是继承。所以迭代器适配器内含了一个迭代器,容器适配器内含了一个容器。为了实现仿函数适配器与仿函数之间的回答与提问。必须包括三个typedef。容器适配器的栗子:这边的改造也可以这样:内含一个deque,它本身有100个函数,但是只用到6个,改函数名称等这都算是一种改造。...

2020-11-11 20:01:59 114

原创 侯捷C++STL体系结构与源码剖析:仿函数剖析

仿函数(functors,别名function object)是我们最容易自己写,然后融入标准库的部件。只为算法服务。仿函数要模仿函数,必须重载operator(),并且是个class。由此产生的对象称为函数对象,或者叫仿函数(是一个对象,像一个函数)。仿函数应用:less< int >是一个类型,加一个(),生成一个临时对象。这里自己定义的myclass没有继承关系,那就没有融入STL体系结构中。继承了就能被适配器(adaptor)去修饰和改造。仿函数需要继承的东西。他们的大小是1

2020-11-11 19:40:43 131

原创 侯捷C++ STL:迭代器的分类

STL六大部件的关系:array,vector,deque是random_access_iterator_tag;list,红黑树(set/multiset,map/multimap)是bidirectional_iterator_tag;forward_list是farward_iterator_tag;而hash(unordered set/multiset,unordered map/multimap)要看底层是单向还是双向。连续空间可以跳,不连续空间不能跳。typename加上(),会生成

2020-11-10 22:37:23 115

原创 一行命令解决:WARNING: You are using pip version 20.2.3; however, version 20.2.4 is available.

解决方法:python -m pip install --upgrade pip -i https://pypi.douban.com/simple

2020-11-10 14:11:03 574

原创 侯捷C++ STL体系结构与内核分析:map/multimap的实现(红黑树的应用)

map/multimap的基本功能:底层实现:通常我们使用者只要放前两个参数。注意const。其他编译平台:select1st重载了(),叫做仿函数(函数对象)。传进去pair,传出first。一个栗子:map独特的operator[]由key找data,找到就返回。如果没有就让该key对应一个默认的data值。又一个栗子。对比放入新元素,multimap要自己配pair,而map可以使用[]。但是[]要先搜索,然后insert,速度上比不了直接插入pair。...

2020-11-09 22:07:56 222

原创 侯捷C++ STL:哈希表(unordered_set,unordered_multiset,unordered_map,unordered_multimap)的底层实现

哈希表的产生由于内存不够一一映射。于是乎在空间不足时取余数。为了防止某一个链表过长,这里根据经验来制定规则。当插入的元素个数等于buckets时这时哈希表要扩容。扩容因子是两倍。但是buckets值尽量是质数,选择质数是为了尽量做到均匀散列。所以扩容后要找两倍大后附近的质数。编译器将空间扩容的空间大小都自己定义好了,不用重新计算空间,53-97-193…。底层实现:HashFcn:一个对象如何映射为一个号码/编号。hasher,key_equal,ExtractKey是function objec

2020-11-09 21:32:57 929 1

原创 手撕力扣之动态规划:爬楼梯、不同路径、最小路径和、三角形最小路径和、买卖股票的最佳时机、打家劫舍1和2、最小花费爬楼梯、礼物的最大价值、剪绳子、连续子数组的最大和、乘积最大子数组、单词拆分、最大正方形

力扣120. 三角形最小路径和DP自下向上(二位数组)class Solution {public: int minimumTotal(vector<vector<int>>& triangle) { // 行数 int n = triangle.size(); // 从倒数第二行开始 for (int i = n - 2; i >= 0; i--) {

2020-11-09 20:12:09 346

转载 手撕力扣动态规划:分割等和子集、零钱兑换12、完全平方数、比特位计数、丑数 II、超级丑数、最长回文子串、回文子串、最长重复子数组、字符串相加、36进制加法、编辑距离、 买卖股票的最佳时机34

力扣416. 分割等和子集只有确定了如下四点,才能把背包问题,套到本题上来。1.背包的体积为sum / 22.背包要放入的商品(集合里的元素)体积为 元素的数值,价值也为元素的数值3.背包如何正好装满,说明找到了总和为 sum / 2 的子集。4.背包中每一个元素一定是不可重复放入。定义里数组为dp[],dp[i] 表示 背包中放入体积为i的商品,最大价值为dp[i]。套到本题,dp[i]表示 背包中总和是i,最大可以凑成总和为i的元素总和为dp[i]。dp[i]一定是小于等于i的,因为背包不能

2020-11-09 19:11:20 333

原创 侯捷C++之STL:set、multiset的底层实现(红黑树)

基本功能:底层实现我们只要指定set的第一参数,第二第三参数是默认的。const_iterator迭代器可以指向这个元素,却不能改变这个元素。由红黑树实现,可以说得上set是个适配器。在其他编译器的实现:例子:...

2020-11-09 08:06:47 981

原创 侯捷C++之STL:红黑数的底层实现

关联式容器查找非常快,插入也很快。key_compare理论上是1个字节(由0变1),他不含任何内存。然后是对齐。head也是刻意放进去的。下面是一个例子,其中value类型是int,表示一个value没有data部分。KeyOfValue表示如何从value中取出key。这里identity是传啥进去就返回啥,本身的意思。测试:新版本:其中_M_color是一个枚举类型。...

2020-11-09 05:20:00 183 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除