- 博客(98)
- 资源 (2)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 对最近的面试遇到问题的查漏补缺
1.函数一直递归会有什么影响?如何优化:答:会造成栈溢出,需要注意的是即使递归函数不传参也会导致栈的溢出。原理:因为函数递归时,栈里保存了上一次递归的函数的状态,不仅仅是参数或者局部变量,哪怕没有参数或局部变量也会溢出。因为栈里至少保存了上一次递归函数的返回地址。优化方法:写成循环,或者写成尾递归(其实就是循环),让编译器进行尾递归的优化。2.函数中死循环会怎么样?,如果是多线程环境下某一个线程死循环了呢?1.造成程序或线程对cpu资源的浪费:例如下图的死循环,程序一直占用着2.
2020-09-08 00:35:40
188
原创 word或wps中如何把visio或公式等转换为图片
选中想要转换的东西,按Ctrl+Shift+F9 即可快速装换为1比1的清晰图片,相当方便。
2021-04-25 15:22:45
7988
2
原创 用一个随机数函数去生成另一个随机数函数:rand(a)生成rand(b)以及rand(a,b) 生成rand(c,d)
让我们把这个问题泛化一下,从特殊到一般。现在我给你两个生成随机数的函数Randa, Randb。Randa和Randb分别产生0到a的随机数和0到b的随机数,a,b不相等 (相等就没必要做转换了)。现在让你用Randa实现Randb。首先当 a>b ,时,最简单的就是通过:int x=a;while(x>b){ x=randA();}return x;即只输出在0-b范围内的情况,但是对于a,b相差很大的情况,会导致循环随机多次,时间消耗太多,做了太多次...
2021-03-22 20:59:55
1607
原创 临界区和互斥量的区别
临界区和互斥锁的区别1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。2、临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。3、临界区和互斥体在Windows平台都下可用;Linux下只有互斥体可用...
2021-03-22 13:56:23
852
原创 动态规划经典题目:最大连续子序列和、最大不连续子序列和
1.最大连续子序列和: 记数组为nums思路:记录dp[i]为i位置结尾的最大连续子序列和则有dp[i]=dp[i-1]>0?(dp[i-1]+nums[i]):nums[i];然后求dp数组的max即为最终结果1.最大不连续子序列和: 记数组为nums思路:记录dp[i]为i位置的最大不连续子序列和则有两种情况dp[i]=dp[i-1] 或者dp[i]=dp[i-2]+nums[i] 即不选或者选择当前位置那么整理为dp[i]=m...
2021-03-13 13:40:58
1978
原创 程序员面试指南(动态规划部分)4:地下城游戏
class Solution {public: int calculateMinimumHP(vector<vector<int>>& dungeon) { //思路:需要计算最少所需的健康点,可以从最后的位置向前推 //因为最后位置所需的最少健康点是确定的 //由于骑士可以向右和向下,那么倒过来就是向左和向上推 //记dp[i][j]为i,j位置所需的最少血量,那么 //dp[i][j]=min{右边的最小,下边的最小}-dungeon[i][j]...
2021-03-11 19:38:14
153
原创 c++基础编程:实现常用数据结构或功能
1.给定一个数据类型,写它的赋值构造函数:例如:实现Stringclass MyString{public: MyString(char *data = nullptr); MyString(const MyString &str); ~MyString();private: char * myData;};MyString& MyString::operator =(const MyString &str) //赋值运算符{ //关注点:1.需...
2021-03-11 16:33:35
139
原创 剑指offer阅读 1:sizeof空类型会产生的结果
1.如果只是简单的空类型,那么结果为1,因为空类型的实例在内存中至少占用一个字节的空间,否则就无法使用了。2.如果包含构造和析构函数呢? 还是1,函数只需要知道地址,跟实例无关。3.如果有虚函数呢? 32位下为4, 64位下为8 ,因为虚函数的存在,实例必须有虚函数指针。...
2021-03-11 15:49:43
106
原创 程序员面试指南(动态规划部分)3:最长递增子序列
class Solution {public: int lengthOfLIS(vector<int>& nums) { int length = 0; int size = nums.size(); if (size <= 1) return size; vector <int> d(size, 1); for (int i = 0; i < size; i++) for (int j = 0; j < i; ++j) ...
2021-03-10 16:29:54
104
原创 程序员面试指南(动态规划部分)3:换钱的方法数
思路1:简单暴力递归思路2:对暴力递归的优化:即通过map等数据结构记录已经计算过一次的状态,后面再次计算只需要查表即可思路3:动态规划
2021-03-10 16:01:32
110
原创 程序员面试指南(动态规划部分)2:矩阵的最小路径和
思路:经典动态规划,设置数组dp[i][j] 记录[i][j]位置的最短路径,由于只能向右或者向下走所以dp[i][j]=min{dp[i-1][j],dp[i][j-1]}+m[i][j];时间复杂度O(N*M),空间复杂度为O(N*M)空间复杂度可以考虑通过状态压缩,压缩到O(min(N,M)),即通过滚动数组来记录状态变换,但是这种压缩的方法不适合需要输出路径过程的场景。无法回溯过程。...
2021-03-10 15:41:47
185
原创 程序员面试指南(动态规划部分)1:斐波那契系列问题
普通思路:1:根据动态规划的状态公式 , 时间复杂度O(N)2:对以上算法中的动态规划公式,转换为矩阵相乘,利用矩阵乘法(矩阵快速幂) 时间复杂度O(logN)...
2021-03-10 14:03:03
129
原创 面试算法题分类
1.自己复现经典数据结构或算法: 复现vector、string等数据结构 复现堆排序等经典算法这块更偏向考察基础知识的熟悉程度。2.其余算法这块更考察算法逻辑的能力和对不同数据结构的运用能力。...
2021-03-08 14:46:33
106
原创 程序员面试图书推荐
算法类:《剑指offer》《程序员代码面试指南》 -左神其余:计算机网络操作系统linux相关再加:具体从事工作方向的书籍:如网络安全等
2021-03-08 14:43:30
196
原创 c++封装给c#调用相关:
c#与c++数据类型对应关系:https://www.cnblogs.com/yiki/archive/2008/10/29/1321848.html详细资料:https://www.cnblogs.com/cheng2015/p/14049082.htmlC#调用C++编写的DLL函数, 以及各种类型的参数传递https://blog.csdn.net/lanshahewu/article/details/106762995...
2021-03-08 14:13:51
260
原创 c++面试提问查漏补缺
1.回调函数是什么,原理?因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。回调函数机制:1、定义一个函数(普通函数即可);2、将此函数的地址注册给调用者;3、特定的事件或条件发生时,调用者使用函数指针调用回调函数。注:为什么要特定事件或条件发生?不应该随时都可以调用...
2021-03-06 16:25:26
110
原创 动态规划例题 1:交错字符串
思路:用dp[i][j] 表示s1的前i个与s2的前j个交错成s3的前i+j个的结果(true或false)初始状态dp[0][0]=true ,零和零组成零,没毛病class Solution {public: bool isInterleave(string s1, string s2, string s3) { int len1=s1.length(); int len2=s2.length(); int len3...
2021-02-22 20:22:00
169
原创 面试谈薪记录
薪酬谈判流程(准备环节忽略):1、寒暄环节:客套一下,感谢公司发offer,快速切入正题;2、呈情阶段:(1)先提出自己的诉求:我期望薪酬大概是XX万年薪;(2)再称述原因:我现在手头拥有XX的offer,薪酬范围大概是多少,因为特别向往贵公司,所以想争取一下; 我评估自己的能力会有更大的成长空间和价值,期望HR大大和业务部门能够满足我的诉求; 如果能满足相应的薪酬,我会在尽快接受offer并且提前实习,提前创造价值;最后等待结果,并再次感谢对方给与这次机会。一般来说,如...
2021-02-20 13:15:47
216
原创 算法题中常见的几种输入的写法:
1.按行输入,第一行是数据的总个数或者总行数,后续是数据(每行中的数据通过空格划分,行与行之间通过换行区分): int nums = 0; cin >> nums; vector<int> wood; int a = 0; for (int i = 0; i < nums; i++) //输入 { cin >> a; wood.push_back(a); }2.按行输入,第一行是数据的总个数或者总行数,后续是数据(每行中的数据可能包
2021-02-17 17:23:42
1922
1
原创 c++中的左值与右值问题:
1、左值和右值的概念C++中左值(lvalue)和右值(rvalue)是比较基础的概念,虽然平常几乎用不到,但C++11之后变得十分重要,它是理解 move/forward 等新语义的基础。左值与右值这两个概念是从 C 中传承而来的,左值指既能够出现在等号左边,也能出现在等号右边的变量;右值则是只能出现在等号右边的变量。int a; // a 为左值a = 3; // 3 为右值左值是可寻址的变量,有持久性; 右值一般是不可寻址的常量,或在表达式求值过程中创建的无名临时对象,短暂性的
2021-02-01 17:57:14
222
原创 春招准备贴
作者:牛客校招助手链接:https://www.nowcoder.com/discuss/585571?type=post&order=time&pos=&page=1&channel=-1&source_id=search_post_nctrack来源:牛客网各岗位书籍推荐Java从入门到进阶必看书单推荐: https://www.nowcoder.com/discuss/582197本书单共包括4个系列,包括Java入门系列、Java进阶系列、.
2021-01-26 01:17:18
188
原创 Effective C++中文版(第三版)阅读感悟4:
但是在自定义类中涉及到自定义类型的这些操作,尤其是成员变量中有引用,指针等,安全起见需要自己重写构造函数,拷贝构造函数,以及析构函数。
2020-12-22 21:11:11
104
原创 Effective C++中文版(第三版)阅读感悟3:
写类的时候最好有成员初始化列表,这个比构造函数的效率更高;必须使用初始化列表的情况1.常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面2.引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面3. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接 调用拷贝构造函数初始化注意:成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的1.类成员中存在常量,如const int a.
2020-12-19 16:13:34
133
1
原创 Effective C++中文版(第三版)阅读感悟2:
书中的观点2:尽量使用const、enum、inline等代替#define因为define带来的问题无法调试找到,define只是简单的字符替换,发生在预处理阶段,无法调试,而const等是可以很方便调试的。涉及知识点:const、enum、inline与#define的区别const的用法:需要注意的是根据const在 * 的左右来判断修饰的是常量还是指针const的作用:1:可以将函数的返回值设置为const放置非法修改: (例如对自定义类型的a,...
2020-12-18 21:51:12
92
1
原创 Effective C++中文版(第三版)阅读感悟1:
序言部分提到了4种不同的编程范型:以下摘自:https://blog.csdn.net/qq_37848398/article/details/109135592C++四种编程范式及例子1. 面向过程(Procedure Programming, PP) 2. 面向对象(Object Oriented Programming, OOP) 3. 泛型编程(Generic Programming,GP) 4. 函数编程(Lambda 表达式实现) 参考 这两天..
2020-12-18 17:50:12
154
1
原创 深信服一面感悟
1.开头的日常自我介绍;2.开始问c++的问题:什么重载和多态的关系啊,虚函数表是怎么实现的因为,同一个类,调用的函数都是一样的,虚函数表占用要内存空间,一样类的函数表就没必要另外在占用内存了,共享了就行)相当于同一个类中每个实例化的对象有自己的虚函数表指针,但是虚函数表指针指向的虚函数表是相同的是共享的。不同类的虚函数表肯定不同。3.指针和引用的区别,然后就是让手写两个int类型数互换的函数,形参使用引用和指针两种方式,需要注意的就是空指针的判断了。4.然后就是两个逻辑题,类似4瓶
2020-12-17 18:49:05
158
原创 深信服面试准备:C/C++软件开发工程师(云计算、网络安全方向)
9.重载和重写的区别:重载是静态多态,重写是动态多态只不过重载是通过同名函数的不同参数类型,参数个数实现不同的功能,而且这是在编译的过程中发生的;重写是通过虚函数的形式实现不同对象同名函数实现不同的功能,在程序运行的过程中发生。10.new,malloc,free和delete的区别:首先,new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数malloc/free是..
2020-12-17 13:56:13
411
2
原创 深信服面试准备:C/C++软件开发工程师(云计算、网络安全方向)
1.c++有哪些容器,介绍一下。说说你对STL的了解,等等。 1.序列式:vector(动态数组,当前大小到达数组容量时进行2倍扩容,以此实现动态数组的效果)、list(双向链表)、 deque(双端队列)(将固定大小的多个数组用指针连接,以此实现首位插入和删除的功能) 2.关联式:(无序)unordered_map/set (底层是hash),特点是查找的时间复杂度是O(1)(有序)map/set (底层是红黑树)引申:为什么是红黑树不是平衡二叉树...
2020-12-17 12:55:24
1754
原创 如何准备面试的自我介绍
1.要换位思考,自我介绍不能是无趣的自说自话,要充分介绍自己的优势。从面试官的角度去看就是两点:“你凭什么来我这”,"我为什么要录用你"第一点意味着,你需要在自我介绍中展示自己跟岗位的匹配程度,证明你是合格的。如果你的特质跟岗位完全不匹配,这场面试对双方来说都是浪费时间;第二点意味着,你需要在自我介绍中突出自己的优势,证明你是值得录用的。对于互联网的招聘来说,一个岗位机会往往有非常多的人投递,如果你不能证明你比别人强在哪里,别人为什么要用你呢。一、关于匹配匹配程度意味着,你需要花时间研究岗.
2020-12-16 16:48:24
347
2
原创 力扣题:1139. 最大的以 1 为边界的正方形
思路:1 直接暴力法,每到一个新的节点就判断以它为左上角是否有正方形,在判断的过程中需要考虑多个条件,及时break减少时间消耗理论上该方法的时间复杂度为O(n*m)*min(n,m) (因为正方形长度最大也就原始网格长宽中最小的一个) ,空间复杂度为O(1)2 考虑到主要的耗时在于判断当前节点是否能构成正方形,可以考虑记录每个节点上下左右为1的边的状态,这样后续节点的判断只需要简单的加减即可。思路进一步可以简化为只需要记录每个节点左边连续1的个数和上边连续1的个数即可...
2020-12-12 19:09:25
157
原创 力扣题:634寻找错位排列
首先直接暴力的时间复杂度很大,下面先贴一个暴力法的结果,然后再是动态规划class Solution {public: int num=0; void dfs(int &sum,int &cur,vector<int> &re,vector<int> &der) { // if(cur>=re.size()) return; if(sum==re.size()-1&&..
2020-12-12 15:55:52
219
原创 力扣经典问题:判断形状是否重叠
1.两个矩形的重叠判断?判断边界即可,假设矩形1的left1,right1,top1,down1,只需要left1>right2||right1<left2||top1<down2||down1>top2 两个矩形就是分开的2.两个圆形的重叠判断?直接判断两个圆心的距离即可3.一个矩形一个圆形的重叠判断?注意题目的最后一句的提示,即找矩形内部或矩形边界上离圆心最近的一点,判断与圆心的距离,<=圆半径,说明有重叠class S...
2020-12-12 00:23:47
624
原创 值传递与引用传递的区别及影响
值传递: (原变量,什么都不带)形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出,除非再return出去。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。指针传递: (前面加*)形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作引用传递:(前面加&)形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函..
2020-12-10 22:52:04
448
原创 算法:回溯+剪枝
回溯算法的定义:在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。解空间树:依据待解决问题的特性,用树结构表示问题的解结构、用叶子表
2020-12-09 14:15:10
3798
原创 力扣解题 1014. 最佳观光组合 有感:
对于设计多层循环寻找多个数的和差,乘积,除数之类的最值问题:可以设计一个local记录前几个数的最值,然后用少几层或者单层循环更新local和当前计算的最值,最终得到结果。注意可以直接一起计算的放到一起,不要被题目迷惑,例如下题的A[i]+i ,A[j]-j 其实是两个整体如果是暴力的话就是双层的循环了:class Solution {public: int maxScoreSightseeingPair(vector<int>& A)...
2020-12-08 22:57:36
109
原创 动态规划经典例题:最长公共子序列相关 、滑动窗口方法
最长公共子序列,可以拓展到非字符串的结构,如数组等,毕竟其实字符串也可以理解为字符数组例题:给两个整数数组A和B,返回两个数组中公共的、长度最长的子数组的长度。示例0:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray著作权归...
2020-12-07 00:39:18
613
原创 面试常考问题:LRU(最近最久未使用)缓存策略的代码实现
主要思路:假设缓存有固定容量,在缓存头部的意味着是最近最久没使用的可以丢弃,在缓存尾部是刚刚使用过的对于读取缓存:get操作 (有则读取,并将该内容放到缓存尾部,代表刚刚使用;无则返回固定的值)对于写入缓存:put操作(有则更新,并将内容放到缓存尾部,代表刚刚使用;无则判断容量是否满,没满直接插入,满了就删除缓存头部再插入)这里想要两者都是O(1)的时间复杂度,可以考虑通过一个双向链表list和一个unordered_map以及一个最大容量max来实现其中list存储键值..
2020-12-06 16:53:21
196
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人