- 博客(46)
- 收藏
- 关注
原创 leetcode二叉树专题---C++实现
二叉树的常见操作222. 完全二叉树的节点个数110. 平衡二叉树257. 二叉树的所有路径222. 完全二叉树的节点个数222. 完全二叉树的节点个数给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例 1:输入:root = [1,2,3,4,5,6]输出:6示例 2:
2022-04-14 19:23:09
1357
原创 leetcode二叉树的层次遍历---C++实现
102 二叉树的层序遍历leetcode 102 二叉树的层序遍历题述:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。示例1:输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例 2:输入:root = [1]输出:[[1]]示例 3:输入:root = []输出:[]/** * Definition for a binary tree node. *
2022-04-09 19:48:56
1366
原创 leetcode二叉树的前中后序及思想(递归非递归)---C++实现
递归写递归,都按照三要素来写:确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。14
2022-04-09 10:39:40
901
原创 leetcode栈和队列---C++实现
栈和队列20. 有效的括号232. 用栈实现队列1047. 删除字符串中的所有相邻重复项844.比较含回退的字符串20. 有效的括号leetcode 20. 有效的括号题述:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s
2022-04-09 09:44:59
463
原创 leetcode链表的基本操作---C++实现
链表的基本操作83 删除排序链表中的重复元素203 移除链表元素707.设计链表206反转链表24.两两交换链表中的结点19. 删除链表的倒数第 N 个结点面试题 02.07. 链表相交142.环形链表II21 合并两个有序的链表14383 删除排序链表中的重复元素leetcode 83 删除排序链表中的重复元素给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例 1:输入:head = [1,1,2]输出:[1,2]示例 2:
2022-03-31 18:52:20
1972
原创 二分查找---C++实现
二分查找题目1:704.二分查找题目2:35. 搜索插入位置题目3:34. 在排序数组中查找元素的第一个和最后一个位置题目4:69. x 的平方根题目5:367. 有效的完全平方数题目1:704.二分查找leetcode 704.二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例1:输入: nums = [-1,0,3,5,9,12], target = 9输出
2022-03-23 17:15:20
10323
1
原创 Linux基本命令
Linux基本命令基本操作基本命令ssh连接服务器lspwdcdtouchmkdirrmdir 和 rmmancpmvcat基本操作基本命令ssh连接服务器一般我们可以使用:ssh ip 的命令形式进行连接远程服务器lsls: 命令是列出目录所有的子目录与文件,对于文件可以列出其他信息。语法: ls [选项] [目录或者文件]常用选项: 前四个很常用。-a 列出目录下的所有文件,包括以 . 开头的隐含文件。-l 列出文件的详细信息。-n 用数字的 UID,GID 代替名称。 (
2022-03-17 10:34:16
3190
4
原创 C++ string模拟实现
string模拟实现简单复制和拷贝功能的实现常规写法简易写法简单复制和拷贝功能的实现常规写法#pragma once#include<iostream>using namespace std;namespace lich{ class string { public: //初始化字符串 string(const char* str) :_str(new char[strlen(str)+1]) { strcpy(_str, str); } //
2022-03-08 21:43:44
704
原创 C++ 字符串string
stringstring简单介绍:构造函数的原型:string简单介绍:string类需要包含头文件string,string类封装了串的属性并提供了一系列允许访问这些属性的函数。细节: string并非是一个独立的类,而是类模板basic_string的一个特化实例。构造函数的原型:sting(); //默认构造函数,建立一个长度为0的串string(const string& str); //赋值拷贝string(const char* s); //用指针s所指向的字符串常量初
2022-03-06 17:25:45
806
原创 C++内存管理
内存管理C/C++内存分布C/C++内存分布分为:栈又叫堆栈:非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高校的I/O映射方式,用于装载一个共享的动态内存库。用户可以使用系统接口创建共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量。看下面的代码示例,选择题如下:#include<iostream>using namespace std;int globalVa
2022-02-10 10:14:15
473
原创 日期类的完整实现
Date类的具体实现头文件内容:Date.h源文件 Date.cpp源文件 Test.cpp头文件内容:Date.h#pragma once#include<iostream>using namespace std;class Date { friend ostream& operator<<(ostream& out, const Date& d); friend istream& operator>>(istream&
2022-02-02 13:42:12
751
原创 C++类与对象(2)
类与对象类的默认成员函数初始化和清理:构造函数:析构函数:类的默认成员函数初始化和清理:构造函数主要完成初始化工作析构函数主要完成清理工作构造函数:我们可以举一个关于日期的简单例子:#include<iostream>using namespace std;//构造函数是特殊的成员函数,构造函数虽然名称叫构造,//但是需要注意的是构造函数的主要任务并不是开空间创建//对象,而是初始化对象//函数与类名相同、无返回值、对象实例化时编译器自动调用、构造函数可以重载cl
2022-01-30 16:56:13
919
原创 C++类与对象(1)
类和对象类的引入:类的简单定义类的两种定义方式类中的访问限定符及封装访问限制符:封装:对象的实例化:类对象的存储方式结构体对齐规则:this指针类的引入:类的简单定义C语言中,结构体只定义变量,在C++中,结构体不仅可以定义变量,也可以定义函数。同时我们应该注意到:C++是兼容C的,所以在C++中,通常使用struct/class 表示类。如下代码所示,主要举例的是C++兼容C的功能:#include<iostream>#include<map>#include&
2022-01-23 17:42:51
415
原创 C++基础(2)
C++基础引用引用定义:定义: 引用不是引入一个新的变量,而是给已经存在的变量取了一个别名。因此编译器也不会给引用变量开辟一个新的空间,它和它的引用的变量共同使用同一个内存空间。引用的定义打个比方就是比如孙悟空和孙大圣的概念,两者实质是一个人;而引用概念也是一样,实质上共同使用同一个内存空间地址。我们可以通过简短代码验证一下:#include<iostream>using namespace std;void TestRef(){ int a = 1; int&
2022-01-20 14:26:26
339
原创 面向对象程序语言的杂谈
浅谈面向对象语言的发展计算机程序语言的发展:机器语言与汇编语言:高级语言:面向对象语言:面向对象的方法:面向对象的由来:面向对象的基本概念:对象:类:封装:继承:多态性:面向对象的软件开发:参考资料:计算机程序语言的发展:语言=语法+语法规则;程序语言是计算机可以识别的语言,供计算机阅读和执行。机器语言与汇编语言:首先我们知道计算机系统包括软件和硬件。软件包括计算机所运行的各种程序以及所需要的有关文档资料。程序使计算机指令的集合。所谓的指令:就是计算机可以识别的命令。一台计算机硬件系统能够
2021-12-16 19:19:26
334
原创 C++基础(1)
C/C++命名冲突问题(namespace):在C语言中,我们在定义变量的时候,由于变量命名和库中的命名有冲突,C语言中并没有解决办法:例如:#include<stdio.h>#include<stdlib.h>//命名冲突问题int rand = 0;int main() { printf("%d", rand); return 0;}产生的结果就会是:编译器会提示rand重定义。而在C++中,我们可以利用命名空间来解决命名冲突的问题:假
2021-11-27 19:14:44
453
原创 堆的基本操作
堆的相关操作相关元素的定义:头文件内容:Heap.c中相关接口实现:main.c的相关内容:相关元素的定义:顺序表实现typedef int HPDataType;typedef struct Heap { HPDataType* a; int size; int capacity;}HP;头文件内容:#pragma once#include<stdio.h>#include<stdlib.h>#include<string.h>#inc
2021-11-13 11:13:02
222
原创 栈的基本操作
栈栈栈的基本概念:栈的顺序结构:栈的存储结构:栈的初始化:栈的销毁:进栈:出栈:读出栈顶的元素计算栈中的元素个数:判断栈是否为空:完整源码:头文件:Stack.h源文件:Stack.c源文件:main.c栈栈的基本概念:栈是只允许在一端进行插入或删除操作的线性表。栈的顺序结构:栈是一种操作受限于线性表,它也有两种存储方式。我们本次的操作是基于顺序表的结构来实现栈的基本功能。栈的存储结构:typedef struct Stack { STDataType* data; int to
2021-10-29 23:34:38
321
原创 双链表的基本操作
双链表可以分为带头的双链表和不带头的双链表而本次是针对带头的循环双链表的基本操作:定义链表中元素的数据类型:typedef int LTDataType;定义链表的基本结构:typedef struct ListNode { LTDataType *data; struct ListNode* next; struct ListNode* prev;}LTNode;初始化双链表:LTNode* ListInit() { //申请头结点 LTNode* phead = (LTN
2021-10-29 18:27:11
585
原创 单链表的基本操作
SList.h头文件:#pragma once#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int SLTDateType;typedef struct SListNode { SLTDateType data; struct SListNode * next;}SLTNode;void SListPrint(SLTNode *phead);void SListPushBac
2021-10-28 22:46:42
110
原创 leetcode---复制带随机指针的链表 138
leetcode 原题链接给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --
2021-10-27 22:49:24
128
原创 leetcode---删除排序链表中的重复元素 83
leetcode原题链接存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。示例 1:输入:head = [1,1,2]输出:[1,2]示例 2:输入:head = [1,1,2,3,3]输出:[1,2,3]提示:链表中节点数目在范围 [0, 300] 内100 <= Node.val <= 100题目数据保证链表已经按升序排列**分析:**画图为例:初始状态:当判
2021-10-26 22:06:26
178
1
原创 leetcode---环形链表 II 142
leetcode—环形链表II给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?示例 1:输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点
2021-10-26 13:10:45
132
原创 leetcode---环形链表 141
leetcode 环形链表给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head
2021-10-25 20:24:55
142
原创 leetcode---相交链表 160
leetcode—相交链表给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。示例:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Intersected a
2021-10-25 17:55:36
127
原创 leetcode---链表的回文结构
描述对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例:1->2->2->1返回:true/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {}};*/struct
2021-10-25 13:34:09
106
原创 leetcode---链表分割
描述:现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {}};*/class Partition {public: ListNode* partition(Lis
2021-10-24 19:57:34
169
原创 leetcode---合并两个有序链表 21
leetcode—合并两个有序链表将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]提示:两个链表的节点数目范围是 [0, 50]-100 <= Node.val <= 100l1 和 l2 均按
2021-10-24 19:13:31
80
原创 leetcode---链表中倒数第k个结点
描述输入一个链表,输出该链表中倒数第k个结点。示例1输入:1,{1,2,3,4,5}返回值:{5}分析:本题的思路是快慢指针的做法,快指针fast,慢指针slow。当然,在确定快慢指针后。我们如何走呢?思路一,可以先让快指针fast走k步,然后slow和fast同时可以进行同步走,直到fast指针指向NULL,为了方便理解,如图所示:起始状态:假设k=4;过程:fast快指针先走k步,如图所示:然后fast和slow指针走到fast为NULL的时候:代码实现:/**
2021-10-24 14:33:02
228
原创 leetcode---链表的中间结点 876
leetcode 链表的中间结点给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.n
2021-10-22 19:48:56
136
原创 leetcode---反转链表 206
leetcode 206 反转链表给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例 2:输入:head = [1,2]输出:[2,1]示例 3:输入:head = []输出:[]分析:思路一: 设置三个指针代码实现:/** * Definition for singly-linked list. * struct ListNode { * in
2021-10-22 13:22:25
101
原创 leetcode---移除链表元素 203
leetcode移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]分析: 我们根据题目可以设置前后指针的方法进行遍历,同时我们要考
2021-10-21 22:16:47
132
原创 leetcode---合并两个有序数组
leetcode合并两个有序数组给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。示例 1:输入
2021-10-21 13:40:38
121
原创 leetcode---移除元素(数组)
leetcode移除元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不
2021-10-20 20:05:40
104
原创 leetcode---旋转数组
leetcode旋转数组给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1
2021-10-20 19:48:45
209
原创 leetcode---消失的数字(数组)
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?注意:本题相对书上原题稍作改动示例 1:输入:[3,0,1]输出:2示例 2:输入:[9,6,4,2,3,5,7,0,1]输出:8分析: 数组nums中含有从0到n的所有整数,但是缺少一个元素。第一种思想: 我们可以从0到nums的数累计相加起来得到从0到nums的之和sum1,然后在计算消失一个整数后的数组元素的累加和sum2,这样sum1-sum2就能得到消失的
2021-10-20 17:22:07
255
原创 数据结构与算法---顺序表(C版)
顺序表顺序表的认识顺序表概念:顺序表的优缺点:顺序表的基本操作:结构体的定义:初始化顺序表:对顺序表进行扩容:对顺序表进行后插:对顺序表进行前插:对顺序表进行后删:对顺序表进行前删:在顺序表中找出给定值的位置:在顺序表中具体的位置插入元素:在顺序表中具体的位置删除元素:在顺序表中删除特定值的元素:Visual Studio下实现的顺序表的基本操作:头文件:SeqList.h源文件:SeqList.c源文件:main.c顺序表的认识顺序表概念:顺序表: 把线性表中的所有元素按照其逻辑顺序依次存储到计算
2021-10-20 16:09:02
477
原创 C语言---通讯录
通讯录contact.h头文件contact.c 源文件main.c源文件contact.h头文件#pragma once#include<stdio.h>#include<string.h>#include<assert.h>#include<stdlib.h>#define DEFAULT_SZ 3#define NAME_MAX 20#define SEX_MAX 2#define TEL_MAX 12#define ADDR_
2021-10-17 19:30:38
102
原创 C语言--联合体和结构体
结构体结构体:结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构体的声明struct Student { char name[20]; //姓名 char sex[2]; //性别 int age; //年龄 char colleage[20]; //学校 char clazz[20]; //班级};结构体的变量的定义和初始化struct Point { int x; int y;}p1;struct Point p2;struct Poi
2021-10-14 23:31:11
1551
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人