自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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++ 重载、重写及其区别

C++ 重载、重写及其区别

2022-03-13 20:39:05 2579 1

原创 C++内存泄漏及内存对齐

C++内存泄漏

2022-03-13 18:55:53 1484

原创 C++局部变量、全局变量、static变量 (堆、栈、静态存储区)

共有两种变量存在静态存储区:全局变量static变量(包括static全局变量和static局部变量)在没有static关键字出现前,只能用全局变量来实现static的功能,之后static不仅实现了全局变量的功能,还做到了可以限制变量的使用范围。存储在静态存储区的变量在程序运行的开始就进行初始化,也是唯一的一次初始化。类中的static静态成员:静态成员函数不含有this指针静态成员可以独立访问,无需创建对象然后下标访问类的静态成员函数属于整个类,而不是属于类的对象调用。 所以他没有

2022-03-13 16:34:22 2242

原创 Linux 系统编程及Webserver开发

Linux下基础知识及webserver开发 每天持续更新中···

2022-03-05 20:07:13 1117

原创 剑指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

原创 C++ Primer 知识点(个人笔记)持续更新···

C++ Primer知识点(个人笔记)持续更新···

2022-02-24 16:20:53 788

原创 剑指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

原创 Leetcode 1706.球会落向何处

这道题的难点在于: 需要理清楚所有可能遇到的情况,并将它没有bug地表示出来。

2022-02-24 11:25:21 142

原创 剑指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

原创 剑指offer 32 - Ⅲ 从上到下打印二叉树Ⅲ

本题和 从上到下打印二叉树Ⅱ 基本没差别,就是多了一个间接反转。利用好计数器和mod运算即可。

2022-02-23 18:55:16 71

原创 剑指offer 32 - Ⅱ 从上到下打印二叉树Ⅱ

本题的关键之处在于vector的嵌套,也就是如何巧妙地分离二叉树的每一层,并将其存进二维数组中

2022-02-23 18:38:24 60

原创 Leetcode 917.仅仅反转字母

利用双指针很快就解决

2022-02-23 15:04:10 407

原创 面试题32 - Ⅰ 从上到下打印二叉树

这道题要实现二叉树的层序打印,所以想到利用队列来保存节点。因为队列具有先进先出的特点,当我们对一个树节点进行操作时,可以判断其左右子节点是否存在。

2022-02-22 16:32:17 55

原创 剑指offer 11.旋转数组的最小值

这道题挺考验*****二分查找*****的功力!

2022-02-21 16:05:12 256

原创 剑指offer 04.二维数组中的查找

这道题一眼暴力遍历,但是如果真这样做,面试官可能就要说:你回去等消息吧!

2022-02-21 15:18:45 287

原创 剑指offer 53-Ⅱ.0~n中缺失的数字

有三种思路:1.直接暴力遍历数组,发现和下标对不上的数字记录下来并返回。2.利用二分法进行巧妙求解。3.利用数学方法求和公式进行计算。

2022-02-21 14:19:37 199

原创 Leetcode 838.推多米诺

这道题的关键之处在于: 多米诺骨牌的受力是以每秒来传递的,即一块多米诺骨牌在一秒内至多给一块多米诺骨牌施加力。

2022-02-21 13:00:55 172

原创 剑指offer 35.复杂链表的复制

先复制节点,然后对每个节点进行指向。

2022-02-20 16:13:17 234

原创 剑指offer 24.反转链表

无它,惟手熟尔!

2022-02-20 14:41:48 106

原创 剑指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

原创 剑指offer 09.用两个栈实现队列

首先明确栈和队列的区别:

2022-02-20 13:20:26 179

原创 Leetcode 1447.最简分数

代码思路很简单,用到了__gcd()函数,用来判断两个数的最大公约数。

2022-02-10 22:10:58 278

原创 Leetcode 1725.可以形成最大正方形的矩形数目

没什么复杂思路,就是找每个小数组的最小值,然后寻找其中的最大值并更新计数器。

2022-02-04 13:39:24 342

原创 Leetcode 1414.和为K的最少斐波那契数字数目

涉及到斐波那契数字的选择

2022-02-03 14:20:20 363

原创 Leetcode 2000.反转单词前缀

没什么思路,这道题就很简单

2022-02-02 13:45:32 454

原创 Leetcode 1763.最长的美好子字符串

要判断一个字符串是不是美好字符串,需要满足字符串中出现的字母必须是大小写都存在,所以可以引用islower()函数,同时保存当前的最长长度和当前字符串的起始位置。

2022-02-01 20:54:13 445

CS144 lab4实验指导书(PDF版)

CS144 lab4实验指导书(PDF版)

2022-01-20

空空如也

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

TA关注的人

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