- 博客(56)
- 收藏
- 关注
原创 数据结构(三)-- 二叉树
树: 一种非线性结构,因为整体结构形似一颗倒挂的的树,所以称该结构为树; 树的逻辑结构示意图: 上图中 F节点被称为根节点 他的左子树是以C为根节点的树结构,他的右子树是以E为根节点的树结构。所以称C为F的左孩子,E为F的右孩子; 树的基本概念: 节点的度: 节点含有子树的个数称为该节点的度 叶子:没有孩子的节点 双亲: 有孩子的节点 树的度: 所有节点的度中最大的一个 树的高度: 树的最深层...
2020-04-28 16:10:14
297
原创 数据结构(二)---栈、队列
栈:一种特殊的线性表只允许在固定的一段进行插入和删除操作,进行数据操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先进后出的原则; 栈的示意图: 栈结构的代码实现(采用顺序表): typedef struct stack { char* arr; int size; int capacity; }stack; 栈的操作 1、压栈:栈的插入操作; 代码实现: vo...
2020-04-11 18:17:07
170
原创 数据结构(一)--顺序表、链表
顺序表:使用一段连物理地址连续的存储单元依次存放数据元素的线性结构;主要表现形式为数组; 空间示意图: 顺序表可以划分为: 1、静态顺序表:使用固定的空间长度来存储数据元素;空间位于栈上; 代码实现: #define N 1024 typedef struct SeqList { int arr[N]; //申请固定大小空间 siz...
2020-04-11 17:47:09
262
原创 leetcode622--设计循环队列typedef struct { int front; int rear; int* arr; i
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyCirc...
2020-04-07 21:27:43
827
原创 双向循环带头链表的基础操作实现
双向循环带头链表的逻辑结构如下所示:(下面便简称双向链表) 本次将实现: 1、双向链表的节点创建,链表创建 2、链表初始化 3、头插尾插操作 4、头删尾删操作 5、任意位置删除以及任意位置前插入操作 6、查找、打印、清空操作 实现一:双向链表节点的创建,链表的创建: typedef struct node { int val; struct node* prev; s...
2020-04-06 09:32:51
176
原创 leetcode147--对链表进行插入排序
插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。 重复直到所有输入数据插入完为止。 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入: -1->5->3->...
2020-04-05 21:59:53
526
原创 删除链表中重复的节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解题思路: 建立三个指针遍历链表 如果后面两个指针指向的内容一致,则将最后一个指针的指向内容删除,并将指针后移,直到不一样,删除中间指针的内容 遍历完整个链表 实现代码...
2020-04-05 21:01:49
118
原创 leetcode138--复制带随机指针的链表
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的 深拷贝。 我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示: val:一个表示 Node.val 的整数。 random_index:随机指 针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,...
2020-04-04 18:32:58
119
原创 leetcode142---环形链表II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 : 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1...
2020-04-04 17:41:20
115
原创 leetcode141--环形链表
给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1], pos = -1...
2020-04-04 17:13:49
120
原创 leetcode160--相交链表
编写一个程序,找到两个单链表相交的起始节点。 示例一: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表...
2020-04-04 17:08:02
120
原创 链表回文结构
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。 测试样例: 1->2->2->1 返回:true 解题思路: 1、找到链表的中点, 2、翻转后半部分的链表节点 3、依次比较是否一致,如果一致则为回文结构 ...
2020-04-04 17:00:48
114
原创 链表分割
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode*pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。 解题思路: 1、创建两个头结点, 2、依次将内容分为小于和大于等于于两个链表 3、合并 实现代码: ListNode* partition(ListNode* pH...
2020-04-04 16:25:00
111
原创 leetcode21--合并两个有序表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 解题思路: 1、建立头结点 2、头结点指向两个链表首元素中小元素 3、更改头节点指针,更改被指链表的指针; 4、如果一个链表被被全部加入...
2020-04-04 14:22:46
120
原创 leetcode8--字符串转整数
请你来实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下: 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。 该字符串在有效的整数部分之后也可能会存...
2020-04-03 21:39:24
116
原创 linux安装总结
如果购买云服务器的话,比较简单快捷,这里主要讲述的是虚拟机的方式,这样更有安装的操作感; 一、安装VMware: 建议安装C盘以外的位置 取消勾选 下一步 点击安装 等待安装 点击完成–>双击进入程序–>输入许可证密钥(为了支持产权,鼓励大家购买,如果实在手头不宽裕可以在网上搜许可证密钥,也是可以很容易找到的): 点击完成 接下来创建虚拟机: 点击自定义; 点击下一...
2020-04-03 17:41:11
1491
原创 leetcode--链表的中间节点
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4,5]) 返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。 注意,我们返回了一个 ListNode 类型的对象 ans,这样: ans.val = 3, ans....
2020-04-01 09:03:07
116
原创 leetcode206--链表翻转
反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 解题思路: 从链表头部开始,设立三个指针指向三个相邻元素,不断地改变之间的链接方向,直到遍历完整个链表 实现代码: struct ListNode* reverseList(struct ListNod...
2020-04-01 08:52:54
114
原创 leetcode203--移除链表元素
删除链表中等于给定值val的所有节点。 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5 解题思路: 分为两种情况考虑: 1、首元素为待删元素; 2、首元素非待删元素 实现删除则是把待删元素的next指向变为其前驱的next指向 实现代码: struct...
2020-04-01 08:41:29
100
原创 链表基础操作实现
实现内容: 1、头插节点 2、尾插节点 3、头删节点元素 4、尾删节点元素 5、指定位置后插入节点元素 6、指定位置后删除节点元素 7、查找某个节点元素 8、清空链表 实现一: 创建节点结构体和链表结构体 typedef int Type; //节点结构体 typedef struct Node { Type data; struct Node* next; }Node; //链表结构体:存放...
2020-03-30 19:56:37
146
原创 leetcode989--数组形式的整形加法
对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。 给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。 示例 1: 输入:A = [1,2,0,0], K = 34 输出:[1,2,3,4] 解释:1200 + 34 = 1234 示例 2: 输入:A = [2,7,4], K =...
2020-03-30 15:18:13
130
原创 leetcode189 --旋转数组
给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。 示例 1: 输入: [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,2,3,4] 示例 2: 输入: [-1,-100,3,99]...
2020-03-30 13:46:16
93
原创 leetcode88--合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nu...
2020-03-28 17:09:37
88
原创 leetcode26---删除排序数组中的重复项
你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 ...
2020-03-28 15:23:46
74
原创 LeetCode27---移除元素
题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的...
2020-03-28 15:01:23
149
原创 替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解题思路: 1、题解可以直接按照默认申请了很大空间,允许直接插入空间的操作, 解法一; class Solution { public: void replaceSpace(char *str,int length) { //...
2020-03-27 22:32:35
67
原创 leetcode892--三维体表面积
题目描述: 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。 请你返回最终形体的表面积。 示例 1: 输入:[[2]] 输出:10 示例 2: 输入:[[1,2],[3,4]] 输出:34 示例 3: 输入:[[1,0],[0,2]] 输出:16 示例 ...
2020-03-25 15:37:58
107
原创 leetcode213--打家劫舍
难度简单683收藏分享切换为英文关注反馈你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额 示例 1: 输入: [2,3,2] 输出: 3 解释: 你不能...
2020-03-24 17:08:26
84
原创 通讯录--文件保存
本文是基于动态存储的通讯录实现中加以修改:动态存储实现通讯录 增加数据写入文件函数: //将数据写入文件 void WriteFile(mindan* book) { FILE* fp = fopen("test.txt", "w"); if (fp == NULL) { perror("文件打开失败!\n"); return; } for (int i = 0; i < b...
2020-03-24 15:40:22
469
原创 leetcode945--使数组唯一的最小增量
给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。 返回使 A 中的每个值都是唯一的最少操作次数。 示例一: 输入:[1,2,2] 输出:1 解释:经过一次 move 操作,数组将变为 [1, 2, 3]。 示例二: 输入:[3,2,1,2,1,7] 输出:6 解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。 解题思路: 1...
2020-03-22 08:24:24
91
原创 leetcode40--最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 示例一: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 示例二: 输入:arr = [0,1,2,1], k = 1 输出:[0] 解题思路: 1、排序(但是对排序方法有要求,冒泡排序时间复杂度太高,不能通过) 2、...
2020-03-20 16:46:05
95
原创 动态内存--通讯录
静态实现:静态实现通讯录 动态实现的修改处: 1、存储人数的结构体修改 typedef struct mindan { int num ; information* everyone; int size; }mindan; 2、初始化修改 void Init(mindan* book) { book->size = 0; book->num = 20; book->...
2020-03-20 15:01:29
168
原创 leetcode409--最长回文串
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。 注意: 假设字符串的长度不会超过 1010。 示例 输入: “abccccdd” 输出: 7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。 解题思路:回文串构成方式有两种: 1、完全是偶个数字母构成,如:aaab...
2020-03-19 15:14:34
100
原创 leetcode836--矩形重叠
矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。 如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。 给出两个矩形,判断它们是否重叠并返回结果。 示例一 输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3] 输出:true 示例二 输入:rec1 = ...
2020-03-18 16:29:02
104
原创 力扣1160--拼写单词
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars,假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。注意:每次拼写时,chars 中的每个字母都只能用一次。 返回词汇表 words 中你掌握的所有单词的 长度之和。 ...
2020-03-17 17:16:36
224
原创 模拟实现通信录
实现一个通讯录;通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法: 1、添加联系人信息 2、删除指定联系人信息 3、查找指定联系人信息 4、修改指定联系人信息 5、显示所有联系人信息 6、清空所有联系人 7、以名字排序所有联系人 第一步:构建一个联系人的结构体: typedef struct people { char name[200]; ch...
2020-03-15 10:59:39
295
原创 力扣7--整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 输出: 321 示例 2: 输入: -123 输出: -321 注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。 解题思路: 1、将传入数据最低为提出赋值到最后的结果...
2020-03-13 15:08:31
178
原创 力扣169--多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。可以假设数组不为空,并且一定存在多数元素: 示例: 示例 1: 输入: [3,2,3] 输出: 3 示例 2: 输入: [2,2,1,1,1,2,2] 输出: 2 解题思路: 如果一个数组中有有一个数大于数组元素的一半,那么那这个数和其他的数挨个抵消,最后一定剩下的也是这个数; 代码实...
2020-03-13 13:59:14
323
原创 结构体内存大小的计算
结构体: 由一系列具有相同类型或不同类型的数据构成的数据集合,属于自定义数据类型 结构体的声明格式: struct iphone { //品牌 char name[1024]; //内存 int rom; //运存 int ram; //电池 int power; //价格 int price; }; 由上可见,struct iphone即是自定义的一个手机结构体,如果我们使用...
2020-03-13 11:22:37
583
原创 socket通信实现
为了实现socket的通信验证,写了一个简单的客服端向服务器端通信的代码 服务器端: 1、版本验证 WORD wVersionRequested=MAKEWORD(2,2); WSADATA result; int err = WSAStartup(wVersionRequested, &result); if (err != 0) { printf("启动失败\n"); W...
2020-03-10 14:54:43
168
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人