- 博客(35)
- 收藏
- 关注
原创 【STL详解】list的模拟实现
目录list的模拟实现总览:1.节点类的模拟实现构造函数2.迭代器类的模拟实现迭代器类的模板参数说明构造函数++运算符的重载--运算符的重载==运算符的重载!=运算符的重载*运算符的重载->运算符的重载list的模拟实现默认成员函数构造函数拷贝构造函数(迭代器版本)拷贝构造函数(现代写法)赋值运算符重载函数(现代写法)其他构造函数析构函数迭代器相关函数访问容器相关函数插入、删除函数insert(...
2022-03-29 16:29:01 1178 70
原创 【STL详解】string类
1.标准库中的string类string类的常用接口说明:1. string类对象的常见构造2.2string类对象的容量操作3. string类对象的访问及遍历操作4. string类对象的修改操作5. string类非成员函数
2022-03-26 21:50:31 4057 53
原创 【Linux】常见指令
01. ls 指令语法: ls [选项][目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:-a 列出目录下的所有文件,包括以 . 开头的隐含文件。在Linux当中,每个目录下默认存在两个隐含文件 . 和 . . ( . 代表当前目录 . . 代表上级目录)。-d 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录-i 输出文件的 i 节点的索...
2022-03-14 22:27:52 422 39
原创 【C++】模板初阶
1. 泛型编程如何实现一个通用的交换函数呢?void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}void Swap(double& left, double& right){ double temp = left; left = right; right = temp;}void Swap(char& left, char&
2022-02-28 16:49:53 156 6
原创 【Linux】常见指令(三)
1.head指令head与tail就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head用来显示档案的开头至标准输出中,而tail想当然尔就是看档案的结尾。语法: head[参数]...[文件]...功能:head用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。选项:-f循环读取 -n<行数>显示行数注:tail指令使用方法与之相同问题:如何读取文件中间某一段内容?假设test.txt文件...
2022-02-24 14:25:46 1171 38
原创 【Linux】常见指令(二)
目录1.man指令(重要)2.cp指令(重要)3.mv指令(重要)4.cat指令5.more指令6.less指令(重要)1.man指令(重要)Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是man语法: man [选项] 命令常用选项:-k 根据关键字搜索联机帮助 num 只在第num章节找 -a 将所有章节的都显示出来,比如 man printf 它缺省从第一章开始搜索,知道就停止,用a
2022-02-21 19:14:45 2553 38
原创 【Linux】常见指令(一)
01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令(重要)06.rmdir指令 && rm 指令(重要)01. ls 指令语法: ls [选项][目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:-a 列出目录下的所有文件,包括以 . 开头的隐含文件。在Linux当中,每个目录下默认存在两个隐含文件 . 和 . . ( . 代表当前目录.
2022-02-18 14:44:22 1107 29
原创 【算法】动态规划-字符串分割
描述给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词)。例如:给定s=“nowcode”;dict=["now", "code"].返回true,因为"nowcode"可以被分割成"now code".拆分词句_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/5f3b7bf611764c8ba7868f3ed40d6b2..
2022-02-11 14:16:55 376 13
原创 【算法】动态规划-Fibonacci
Dynamic ProgrammingDP定义:动态规划是分治思想的延伸,通俗一点来说就是大事化小,小事化无的艺术。在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接使用这些结果。动态规划具备了以下三个特点:1. 把原来的问题分解成了几个相似的子问题。2. 所有的子问题都只需要解决一次。3. 储存子问题的解。动态规划的本质,是对问题状态的定义和状态转移方程的定义(状态以...
2022-02-06 22:13:36 215 17
原创 【C++】内存管理
【本节目标】1. C/C++内存分布2. C语言中动态内存管理方式3. C++中动态内存管理4. operator new与operator delete函数5. new和delete的实现原理6. 定位new表达式(placement-new)7. 常见面试题1. C/C++内存分布我们先来看下面的一段代码和相关问题int globalVar = 1;static int staticGlobalVar = 1;void Test(){ static int stati
2022-02-04 14:07:22 287 26
原创 【C++】引用
1.引用1.1 引用概念引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。类型& 引用变量名(对象名) = 引用实体;int main(){ int a = 10; int& b = a;//给变量a去了一个别名,叫b cout << "a = " << a << endl;//a打印结果为10 cout << "b = " <<
2022-01-25 11:51:58 853 37
原创 【C++】输入输出,缺省参数,函数重载
1.C++输入&输出新生婴儿会以自己独特的方式向这个崭新的世界打招呼,C++刚出来后,也算是一个新事物那C++是否也应该向这个美好的世界来声问候呢?我们来看下C++是如何来实现问候的。#include<iostream>using namespace std;int main(){ cout << "Hello world!!!" << endl; return 0;}说明:1.使用cout标准输出(控制台)和cin标准输入
2022-01-24 20:46:38 422 10
原创 【C++】命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。1.定义定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{ }即可,{ }中即为命名空间的成员。//1. 普通的命名空间namespace N1 // N1为命名空间的名称{ // 命名空间中的内容.
2022-01-23 17:01:17 205 22
原创 【数据结构】栈和队列
【本节目标】1.栈2.队列3.栈和队列面试题1.栈1.1栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。1.2栈的实现栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在...
2022-01-19 17:28:30 224 29
原创 【数据结构】顺序表和链表(下)
【数据结构】顺序表和链表(上):https://blog.csdn.net/m0_51866180/article/details/122301767?spm=1001.2014.3001.5502https://blog.csdn.net/m0_51866180/article/details/122301767?spm=1001.2014.3001.5502【本节目标】3.链表4.顺序表和链表的区别3.链表3.1链表的概念及结构概念:链表是一种物理存储结构上非连续、非顺序的..
2022-01-19 17:15:51 180 21
原创 【LeetCode】-27-移除元素
给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。较优方法:int removeElement(int* nums, int numSize, int val){ int src = 0; int dst = 0; while (src < numSi...
2022-01-04 15:02:08 338 25
原创 【数据结构】顺序表和链表(上)
【本节目标】1.线性表2.顺序表1.线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。2.顺序表2.1概念及结构顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组...
2022-01-04 14:12:25 222 25
原创 【数据结构】-排序-快速排序
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。基本思想:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。将区间按照基准值划分为左右两半部分的常见方式:Hoare法、挖坑法、前后指针法。1. hoare版本动图理解:选择方式:1.当选择最左做key时,右边先走。-->左右相...
2021-12-16 23:36:42 1309 31
原创 【数据结构】-排序-堆排序
堆排序:堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。先建堆,排升序建大堆,选出最大的数(大堆,堆顶为最大值)将其放到最后,然后满足大小堆后即可做向下调整动作(向下调整必须两个子树都是大堆或小堆)。动图理解:分布图解:建堆:从最后一颗子树开始建。最后一个元素坐标为n-1,则子树坐标为(n-1-1)/2。选出最大的数将其...
2021-12-09 14:23:59 3005 36
原创 【数据结构】-排序-选择排序
选择排序:基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。直接选择排序:在元素集合array[i]--array[n-1]中选择关键码最大(小)的数据元素。若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换。在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。动...
2021-12-09 10:38:46 621 24
原创 【数据结构】-排序-希尔排序
希尔排序:希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。插入排序时:数组接近有序的时候,时间复杂度趋于O(N)。希尔排序是对于直接插入排序的优化,通过预排序使数组趋于有序希尔排序的分为预排序(gap > 1)和直接插入( gap == 1)排序两步骤。分组预排序使数...
2021-12-07 16:05:12 1845 28
原创 【数据结构】-排序- 直接插入排序
常见排序算法:插入排序基本思想:直接插入排序是一种简单的插入排序方法,把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。实际中我们玩扑克牌时,就用了插入排序的思想动图理解:当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与 array[i-1], array[i-2 ],…的排序码顺序进行比...
2021-12-07 00:14:35 820 11
原创 【LeetCode】-160-相交链表
给你两个单链表的头节点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-11-10 23:04:11 149 18
原创 【剑指offer】OR36 链表的回文结构
描述对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试案例:1->2->2->1返回:true方法:1.首先找到中间位置2.逆置右半边3.个个对比/*struct ListNode { int val; struct ListNode *next; L...
2021-11-08 20:12:10 126 10
原创 【剑指Offer】CM11 链表分割
现有一链表的头指针 ListNode*pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。易错点:会产生环状链表修改:struct ListNode* partition(struct ListNode* pHead, int x){ //哨兵位 struct ListNode* lessHead, * lessTail, * greaterHead, * greaterTail;...
2021-11-03 21:22:57 112 9
原创 【LeetCode】-21- 合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){ if (!l1) return l2; if (!l2) return l1; struct ListNode* head = NULL; struct ListNode* tail = NULL; while (l...
2021-10-29 01:03:58 182 11
原创 【剑指offer】链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。输入:1,{1,2,3,4,5}输出:{5}思路:快慢指针struct ListNode* FindKthToTail(struct ListNode* pListHead, int k){ struct ListNode* fast = pListHead; struct ListNode* slow = pListHead; while (k--) { if (fast == NULL) return NULL..
2021-10-29 00:29:08 94 6
原创 【LeetCode】-876-链表的中间结点
给定一个头结点为head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。输入:[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.next.next.next = NULL...
2021-10-29 00:17:20 111 1
原创 【LeetCode】-206-反转链表
给你单链表的头节点head,请你反转链表,并返回反转后的链表。思路一:头插/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* reverseList(struct ListNode* head) { struct ListNode* newHe...
2021-10-29 00:03:25 120 6
原创 【LeetCode】-203-移除链表元素
给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val == val的节点,并返回新的头节点。/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* removeElements(struct ListNode* head, int val...
2021-10-28 00:44:04 157 6
原创 【LeetCode】-88-合并两个有序数组
给你两个按 非递减顺序 排列的整数数组nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。void merge(int* n..
2021-10-27 23:54:24 125 5
原创 【LeetCode】-26-从排序数组中删除重复项
给定一个有序数组,删除重复内容,使每个元素只出现一次,并返回新的长度。不要为其他数组分配额外的空间,您必须通过在O(1)额外的内存中就地修改输入数组来实现这一点。思路:int removeElement(int* nums, int numsSize) { int i = 0; int j = 1; int dest = 0; while (j < numsSize) { if (nums[i] == nums[j]) { j++; }...
2021-10-27 23:29:17 88 1
原创 Fibonacci数列变形题
【解题思路】:如果斐波那契数列中的一个数比当前数要大,则开始计算数列中的当前数和前一个数,哪一个数更近,则算出步数。#include<stdio.h>#include<stdlib.h>int main(){int num = 0;scanf("%d", &num);int f1 = 0, f2 = 1, f3 = f1 + f2;while(1){if(f2 == num){printf("%d\n"...
2021-10-19 19:42:35 195 9
原创 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
【解题思路】:先计算出空格的个数,然后每个空格的替换需要多空出两个位置。然后从后往前遍历,如果是空格,则进行替换。如果不是空格,则往后挪动【前面的空格数*2】个位置。class Solution {public:void replaceSpace(char *str,int length) {// 计算空格的个数int space_num = 0;for(int i = 0; i < length; ++i){if(...
2021-10-19 19:09:19 594 6
原创 函数栈帧解析
文章目录一、什么是函数栈帧 1.寄存器 2.函数栈帧 3.栈帧的作用和维护 4.栈帧结构 二、函数栈帧的创建 1.汇编 2.main函数 3.Add函数的创建 三、函数栈帧的销毁 汇编 四、了解一、什么是函数栈帧1.寄存器:eax, ebx, ecx ...ebp - 存放了指向函数栈帧栈底的地址esp - 存放了指向函数栈帧栈顶的地址2.函数栈帧函数被调用时,系统会在栈区为该函数开辟一块栈空间,...
2021-09-05 17:01:14 320 18
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人