- 博客(86)
- 资源 (8)
- 收藏
- 关注
原创 如何定义一个只能在栈(堆)生成对象的类?
在栈上生成对象一般地,当我们使用new操作符生成类对象时,存在以下两个步骤:new操作符首先底层调用malloc在堆上分配内存地址,并将其分配给对象然后调用构造函数所以,如果通过new创建类对象,可以通过将new和delete运算符重载为私有。在堆上生成对象一般地,当我们简单创建类对象时(不通过new),类对象是保存在栈上地。那么如何将其保存在堆上呢?首先,C++是静态绑定成员,由编译器去管理栈上对象的声明周期。编译器在为类对象分配栈空间时,会先检查类的析构函数的可访问性,如果析构函数不可
2022-04-11 12:44:58
419
原创 C++ const那些事
为什么要把类对象定义成const,即定义成const类对象?也许是为了保持严谨?虽然我认为一个类对象定义成常量与否问题不大。可能是配合const成员函数一同服用吧。const成员函数又是怎么一回事?当我们有一个类:class Sales_data{ string isbn() const {return bookNo;} string bookNo;};Sales_data total; //定义一个类对象当调用total.isbn();时,成员函数会通过一个名为t
2022-04-04 16:56:21
858
原创 Linux下常见I/O模型及其相关基础知识
自从接触Linux服务器开发到现在,对于阻塞、非阻塞、同步、异步这些概念其实还是感觉挺模糊的,查了很多资料,看了很多博客和文章,现在从个人理解的角度来总结一下这些概念的区别,既方便自己的复习,也希望可以给看到这篇博客的伙伴们一个相对正确的指引。I/O复用是什么I/O多路复用就是一种使得程序可以同时监听多个文件描述符的技术,能够提高程序的性能。其中的I/O是指socket对读写缓冲区(内存)的读写操作,不是简单意义上的cin和cout。在Linux下能够实现I/O多路复用的系统调用方法主要有:select
2022-04-04 13:28:44
1248
原创 C++构造函数的种类及其作用
C++中有四类构造函数:默认构造函数、初始化构造函数、拷贝构造函数和移动构造函数。当有了有参数的初始化构造函数,编译器就不会提供默认构造函数了。默认构造函数和初始化构造函数:class Student{public: //默认构造函数 Student() { num=1001; age=18; } //初始化构造函数 Student(int n,int a):num(n),age(a){}priva
2022-03-15 13:35:28
1828
原创 C++局部变量、全局变量、static变量 (堆、栈、静态存储区)
共有两种变量存在静态存储区:全局变量static变量(包括static全局变量和static局部变量)在没有static关键字出现前,只能用全局变量来实现static的功能,之后static不仅实现了全局变量的功能,还做到了可以限制变量的使用范围。存储在静态存储区的变量在程序运行的开始就进行初始化,也是唯一的一次初始化。类中的static静态成员:静态成员函数不含有this指针静态成员可以独立访问,无需创建对象然后下标访问类的静态成员函数属于整个类,而不是属于类的对象调用。 所以他没有
2022-03-13 16:34:22
2242
原创 剑指offer 52.两个链表的第一个公共节点
题目地址解题思路有两种解题方法:双指针法和哈希表法。双指针法比较巧妙,这已经是第三遍写了,就不多详述了。哈希表法就是先保存其中一个链表的全部节点。然后遍历另一个链表,如果已经保存就直接返回。代码实现(C++)双指针法/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(N
2022-02-27 14:32:38
169
原创 剑指offer 25.合并两个排序的链表
题目地址解题思路这道题运用了递归的思路:首先我们需要判断两个链表是否为空,再将特殊情况的链表处理完之后,再进行一般化的思路;一般地,当l1所指的节点值小于l2所指的节点值时,我们就会将l1->next指向 mergetwolists(l1->next,l2)的返回值,同理类似。当然也可以使用迭代法,迭代法需要引入一个新头节点,和一个指向新头节点的指针。代码实现(C++)递归法/** * Definition for singly-linked list. * struct L
2022-02-27 13:38:07
207
原创 剑指offer 47.礼物的最大价值
题目地址解题思路首先我们思考:当我们处于矩阵中某个常规单元格时,此时该单元格的最大价值profit[i][j]应该怎么计算呢?我们可以很容易得出:profit[i][j]=max(profit[i-1][j],profit[i][j-1]) + grid[i][j];即处于当前单元格时的最大价值等于(上面一格和左边一个 中 最大价值的较大值) 加 当前单元格的价值;当然会有一些特殊情况,比如第一行的单元格,第一列的单元格,这些情况需要单独处理:具体处理细节在下面的代码中都有体现:代码实现(C+
2022-02-26 18:47:10
340
原创 Leetcode 2016.增量元素之间的最大差值
题目地址解题思路我们可以对数组进行遍历,但是遍历是从数组第二个元素(下标为1)开始,初始化res为INT_MIN,初始化前者pre为nums[0];然后对于每一个nums[j],我们判断此时nums[j]是否大于pre;如果nums[j]>pre: 我们计算nums[j]-pre,并取其值与res的较大值,将其赋值给res;如果nums[j]<pre: 我们重置pre为当前的nums[j];最后return res==INT_MIN ? -1 : res;代码实现(C++)cl
2022-02-26 18:06:33
214
原创 剑指offer 63.股票的最大利润
题目地址解题思路每天需要考虑的事:如果我是在历史最低点买的股票,那么今天出售能得到多少利润。代码实现(C++)class Solution {public: int maxProfit(vector<int>& prices) { int min_price=INT_MAX; int max_profit=0; for(auto p : prices) { max_prof
2022-02-25 16:26:04
171
原创 剑指offer 10-Ⅱ 青蛙跳台问题
题目地址解题思路这道题的思路类似于斐波那契数列,具体体现为:当青蛙要跳上n级台阶的方法数定义为f(n);此时有两种情况:最后跳一级台阶,此时有f(n-1)种方法数;最后跳两级台阶,此时有f(n-2)种方法数;综上:对于跳n级台阶的方法数f(n)有:f(n)=f(n-1)+f(n-2);所以整个代码的实现过程已经捋清楚了,采用迭代的方法,将每一级的方法数保存至vector中;代码实现(C++)class Solution {public: int numWays(int n)
2022-02-25 16:16:50
271
原创 剑指offer 10-Ⅰ 斐波那契数列
题目地址解题思路一开始想着用递归的方法,然后最后写出来是超时的,但是逻辑没有错,只是因为题目要求:需要对答案求模,所以最后选择了从2至n的所有斐波那契数。具体实现看代码就懂了代码实现(C++)递归实现(leetcode超时版)class Solution {public: int fib(int n) { int Mod=1000000008; if(n==0) { return 0; }
2022-02-25 16:09:02
130
原创 Leetcode 537.复数乘法
题目地址解题思路思路就是:利用substr()函数把复数拆分成两部分,分为实部和虚部,再用复数的运算法则对实部和虚部分别运算。最后将字符串拼接并在末尾加上i。详见下面的代码代码实现(C++)class Solution {public: string complexNumberMultiply(string num1, string num2) { int pos1=num1.find("+"); int pos2=num2.find("+")
2022-02-25 12:48:42
327
原创 Leetcode 456. 123模式
题目地址解题思路参考宫水三叶自己再捋一次:原理:三次下标从小到大的数(不必相邻),要满足数量级:小大中 的关系那要如何去实现呢?我们可以将132(小大中) 借指为i,j,k,我们利用stack这一数据结构来实现单调数组。栈中存储的数据是按照从栈底到栈顶 非递减 的方式储存的,每当nums[i](i从数组右侧开始计数)大于栈顶的元素时,我们将栈顶元素pop()出来,并赋值给K,再将nums[i]压入栈中。当我们搜索到存在某个nums[i]<k时,我们就返回true。而当遍历完整个数组都没
2022-02-24 19:49:19
194
原创 剑指offer 28.对称的二叉树
题目地址解题思路本题要判断一棵树是否为对称二叉树,可以利用栈来实现递归,具体实现方式为:建立双节点指针,初始化为根节点的左右节点(当根节点不为空时);而后对两指针所指节点进行判断,如符合对称条件,则交叉将其左右子节点push进栈。重点:为什么要交叉push呢? 其实仔细想就能明白。因为栈的后进先出特性以及对称二叉树的特性。代码实现(C++)/** * Definition for a binary tree node. * struct TreeNode { * int v
2022-02-24 12:53:12
81
原创 剑指offer 27.二叉树的镜像
题目地址解题思路本题有两种方法实现:递归法栈或队列实现个人认为:栈实现比较符合认知,也很容易理解。而用递归去实现容易绕不出来。代码实现(C++)法一:递归法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NUL.
2022-02-24 12:37:30
316
原创 剑指offer 26.树的子结构
题目地址解题思路要判断一棵树B是不是另一棵树A的子结构:B如果是空树,那么直接返回falseA如果一开始就是空树,那么直接返回false如果B树已经遍历完了(和A同步遍历),那么直接返回true。其中包含两种情况:B树遍历完了,且A树也遍历完了;B树遍历完了,但是A树没有遍历完。如果A树已经遍历完了,且B树没有遍历完,那么返回false(B树遍历完的情况在第三点已经提到了)。依次运行上面的判断条件,然后判断两个数当前节点的值是不是相同,(1)如果不相同,则返回false;(2)如果相同,
2022-02-23 19:56:24
124
原创 面试题32 - Ⅰ 从上到下打印二叉树
这道题要实现二叉树的层序打印,所以想到利用队列来保存节点。因为队列具有先进先出的特点,当我们对一个树节点进行操作时,可以判断其左右子节点是否存在。
2022-02-22 16:32:17
55
原创 剑指offer 53-Ⅱ.0~n中缺失的数字
有三种思路:1.直接暴力遍历数组,发现和下标对不上的数字记录下来并返回。2.利用二分法进行巧妙求解。3.利用数学方法求和公式进行计算。
2022-02-21 14:19:37
199
原创 Leetcode 838.推多米诺
这道题的关键之处在于: 多米诺骨牌的受力是以每秒来传递的,即一块多米诺骨牌在一秒内至多给一块多米诺骨牌施加力。
2022-02-21 13:00:55
172
原创 剑指offer 06.从尾到头打印链表
题目地址解题思路解法一思路:遍历链表并保持每个节点的val值,最后利用reverse()函数将val值反转。需要特别注意的是:我再解法一 中有一个特别不好的习惯,我直接对head指针进行next操作,而没有定义一个指针指向head之后再进行操作,这样不太好。解法二思路:利用栈来实现:即用栈保存每个节点的值,最后依次pop出来,并将其保存到vector中。代码实现(C++)解法一:/** * Definition for singly-linked list. * struct Li
2022-02-20 14:21:29
304
原创 剑指offer 30.包含min函数的栈
想到:每次向栈里面push新元素的时候,我们取当前栈中最小的元素和新元素进行对比,然后择小,将其push进一个只存放(阶段小元素)的栈st_min中。
2022-02-20 13:50:11
157
原创 Leetcode 1763.最长的美好子字符串
要判断一个字符串是不是美好字符串,需要满足字符串中出现的字母必须是大小写都存在,所以可以引用islower()函数,同时保存当前的最长长度和当前字符串的起始位置。
2022-02-01 20:54:13
445
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人