
耐心是成功的唯一秘诀1.lamada表达式是什么auto cmp [](ListNode * a,ListNode * b){ return a-val b-val; } priority_queueListNode*, vectorListNode*, decltype(cmp) heap(cmp);先来复习一下lamda表达式中的[ ]( ){ }中分别放的什么意思①[]- 捕获列表指定外部变量如何在 Lambda 内部使用[]不捕获任何变量-只能使用参数[]值传递捕获所有变量❌ 不能修改拷贝一份只读[]引用传递捕获所有变量✅ 可以修改直接引用原变量[x]值传递捕获变量 x❌ 不能修改只捕获 x[x]引用传递捕获变量 x✅ 可以修改只捕获 x[, x]值传递捕获所有x 用引用x 可修改混合捕获[, x]引用传递捕获所有x 用值x 不可修改混合捕获[this]捕获当前对象的 this✅ 可以修改在类中使用②-参数列表和普通函数的参数一样auto lambda1 []() { return 10; }; // 无参数 auto lambda2 [](int a) { return a * 2; }; // 一个参数 auto lambda3 [](int a, int b) { return a b; }; // 多个参数 auto lambda4 [](ListNode* node) { return node-val; }; // 自定义类型③{ } - 函数体具体的函数实现和普通函数没有什么区别总的来说lamda表达式其实就是一个简易函数而前面我们说的cmp就是这个函数的函数名2.怎么在算法中创建堆?auto cmp [](ListNode * a,ListNode * b) { return a-val b-val; } priority_queueListNode*, vectorListNode*, decltype(cmp) heap(cmp);上面的cmp中的 a-value b-val,表示这个是小根堆cmp给heap传给构造参数的意思默认不写比较器的lamda函数实现的是小根堆想要实现大根堆就自定义lamda函数并且将其中的a-val b-val 写成 a-val b-val为什么a-val b-val 反而实现的是小根堆呢因为priority_queue的比较逻辑是当比较器返回true时第一个参数被认为优先级更低。所以a-val b-val让值大的节点优先级低值小的节点优先级高自然就形成小根堆值小的在顶部。参数1 (Type) 队列中存什么类型的数据参数2 (Container) 用什么容器来存储这些数据参数3 (Compare) 用什么规则来比较大小记忆点为什么建堆的类型是优先队列优先队列和堆的关系是什么这是因为堆本质上是队列的一个变种由队列的先进先出变种成出去的时候是优先级更高的先出去所以堆也叫做优先级队列3.vectorint s{0}和vectorint s的区别是什么所以不是所有的变量都要有初始值的4.如何判断一个数在不在hash表中(count)hash.count(x); 如果在的话返回true不在的话返回falsehash.count的时间复杂度是O(1),count的底层逻辑看的是key5.hash[x]返回的究竟是什么如果x是下标的话呢hash[x]返回的就是x下标对应的value,如果x是值的话呢hash[x]返回的就是下标6.unordered_map和unordered_set的区别是什么7.中心扩展算法用于处理回文字符串问题先固定一个中心点从中心点开始向两边扩展奇数长度以及偶数长度都需要考虑当是偶数的时候要先让left或者right走一步然后再进行向两边拓展class Solution { public: string longestPalindrome(string s) { //中心拓展算法 int begin 0; int end 0; int ns.size(); int len 0; for(int i0;in;i) //依次枚举每一个中心结点 { int left i; int right i; //进行奇数次的中心拓展 while(left0 right n s[left] s[right]) { left--; right; } //更新最长回文子串的长度 if(right-left-1 len) { begin left1; len right-left-1; } //进行偶数次的中心拓展 left i; right i1; while(left0 right n s[left] s[right]) { left--; right; } //更新最长回文子串的长度 if(right-left-1 len) { begin left1; len right-left-1; } } return s.substr(begin,len); } };8.什么是高精度加减乘除所谓的高精度就是位数多到我们的double都没办法存储对于它的加减乘除计算我们要使用模拟的方法而它的背后是对我们小学学习的列竖式的模拟9.在算法题中怎么进行数字和字符的转换10.字符串相乘我们这里说的字符串其实就是高精度数字对于这样的数字想要进行乘法接着使用传统的模拟乘法运算的列竖式是不够的细节太多很容易出错所以我们应该使用的是无进位相乘再相加的方法这种方法的好处在于处理的细节会变少class Solution { public: string multiply(string num1, string num2) { reverse(num1.begin(),num1.end()); reverse(num2.begin(),num2.end()); int mnum1.size(); int nnum2.size(); vectorint result(mn-1); for(int i0;in;i) { for(int j0;jm;j) { result[ji] (num2[i]-0)*(num1[j]-0); } } string ret; int t0; int cur 0; while(cur mn-1 || t!0) { if(curresult.size()) t result[cur]; ret t%100; t/10; } //处理前导0 while(ret.size()1 ret.back() 0) //result.size()1这是为了防止当只有一个0的时候还被删除掉 { ret.pop_back(); } reverse(ret.begin(),ret.end()); return ret; } };