自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

TIED_Space

好好学习

  • 博客(45)
  • 收藏
  • 关注

原创 二叉树的右视图,二叉搜索树中第k小的元素

【代码】二叉树的右视图,二叉搜索树中第k小的元素。

2024-06-01 23:19:05 319

原创 汇总区间,合并区间

【代码】汇总区间,合并区间。

2024-05-31 22:42:49 389

原创 长度最小的子数组,无重复字符的最长子串

【代码】长度最小的子数组,无重复字符的最长子串。

2024-05-30 23:35:31 291

原创 两数之和 II - 输入有序数组,三数之和

【代码】两数之和 II - 输入有序数组,三数之和。

2024-05-30 16:55:16 321

原创 删除链表中重复元素II,删除链表倒数第n个元素

【代码】删除链表中重复元素II,删除链表倒数第n个元素。

2024-05-30 01:23:10 345

原创 最长递增子序列,交错字符串

表示i位置的元素大于j位置的元素时,dp[i]取dp[i]和dp[j] + 1两者之间的最大值。结合状态表示来理解。每当dp[i]更新完之后,可以更新一下最终结果,走完之后,就可以返回最终结果res了。动态规划,用到二维dp。在此之前,需要进行一个问题的转化,其实就是判断字符串s1能否由s2和s3组成。使用动态规划,线性dp就可以解决。水平有限,欢迎指正。

2024-05-29 22:24:40 591

原创 进程控制相关

pid_t pid:可以有四种状态,当pid = -1时,代表等待任意一个子进程退出,当pid > 0时,会等待对应子进程识别码为pid的子进程退出,当pid < -1时,等待进程组识别码为pid绝对值的任何子进程,当pid = 0时,等待进程组识别码为pid的子进程。fork()之后,父子进程各自执行进程代码的一部分,但如果子进程想执行一个全新的程序,就要通过进程程序替换,通过特定的接口,加载磁盘上的一个全新的程序(代码+数据),加载到调用进程的地址空间中。3、代码没运行完,进程异常退出。

2024-04-19 22:32:56 772

原创 进程及进程地址空间

2、因为有地址空间的存在,因为有页表的映射存在,物理内存中可以对数据进行任意位置的加载,原本物理内存中的几乎所有数据和代码在内存中是乱序的,有了地址空间和页表后,在进程视角,所有的内存分布都可以是有序的,所以地址空间+页表的存在可以将内存分布有序化。3、进程要访问的物理内存中的数据和代码,可能目前并没有在物理内存中,同样的,也可以让不同的进程映射到不同的物理内存,通过地址空间+页表的方式实现了进程的独立性。上面的例子中,子进程先退出,父进程后退出,在子进程退出而父进程未退出的时间段内,该子进程为僵尸进程。

2024-04-19 00:10:22 591

原创 C++智能指针

使n2的_prev指向n1,那么n1的计数变为n2,在析构的时候,后定义的先析构,此时n2先析构,n2的计数变为1,n1后析构,n1的计数变为1,那么_next和_prev何时析构?因为_next指向n2,n2的计数为1,n2的_prev指向n1,n1的计数为1,想让_next析构,就得使_next所在的n1计数变为0,所以要让指向n1的_prev先析构,weak_ptr的提出,是为了解决shared_ptr的循环引用问题,weak_ptr可以接收shared_ptr且不会增加该对象的引用计数。

2024-04-17 00:20:49 343

原创 C++11的新特性

如果在类中显式定义了,编译器将不会重新生成默认版本。依然是上面的代码,通过移动语义,会将tmp返回时构造的临时对象识别为”将亡值“,C++11认为临时对象为右值,将返回对象的资源直接转移给该临时对象,而再构造c时,又会调用移动语义,直接将返回的临时对象资源转移给对象c。应用场景:使用algorithm中的sort时,对自定义类型对象进行排序,需要给出对应的比较规则,往往都是通过仿函数来实现,但每出现一个类别,就要定义一个类,写一个用于比较的仿函数,比较繁琐,而lambda表达式可以很好的解决这个问题。

2024-04-16 01:33:10 838

原创 C++模板编程

通常情况下,模板的使用可以实现与类型无关的代码,但有些特殊类型会得出错误的结果,此时需要对特殊类型进行特殊处理,称为模板特化。例如:当用int类型使用函数模板时,编译器通过对实参类型的推演,将T确定为int类型,然后产生一份专门处理int类型的代码。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。1. 函数重载只是参数类型不同,当出现新类型的参数时,就要手动的再实现一份。用不同类型的参数使用函数模板时,称为函数模板的实例化。函数模板的实例化又分为。

2024-04-11 02:42:12 1146

原创 C/C++内存管理

(1)如果是自定义类型,malloc/free只会进行对应大小的空间申请,并不会对资源进行初始化,而new会在调用operator new申请对应的空间后,自动调用该类的构造函数来进行资源的初始化,delete则会在调用operator delete释放资源之前先调用对应类的析构函数来进行资源的清理。如果是内置类型,new/delete和malloc/free基本类似,不同的是malloc/free进行单个元素空间的申请,new[ ]/delete[ ]进行连续多个元素空间的申请。

2024-04-09 22:39:46 858

原创 C++类和对象(下)

当Student类作为Person类的内部类时,创建一个Person对象p,sizeof(p)的大小是8字节,如果放开注释,即在Person类中用Student类创建一个stu对象,那么此时sizeof(p)的大小是12字节。1、友元关系是单向的,具体来说,就是A类是B类的友元类时,A的成员函数可以访问B的私有成员变量,而B的成员函数则不能访问A的私有成员变量。2、友元关系不能传递,具体来说就是如果B类是A类的友元,C类是B类的友元,则不能说明C类是A类的友元。(可能有点绕,可以画个图)。

2023-06-17 19:10:44 330

原创 C++类和对象(中)

因为浅拷贝是按字节序直接拷贝的,就是值拷贝,如果被拷贝的类中不涉及指针,那么是没有问题的,比如刚开始的Person类,只有weight和stature这两个变量,那么就可以采用”浅拷贝“,而对于上面定义的Basic类就不行,因为存在指针array,这个指针申请的空间的地址存在这个指针变量中,如果采用值拷贝,那么。而析构函数的出现,可以解决这个问题(前提是你写了),当调用类的函数时,因为类的成员函数的地址是存放在公共代码区的,所以在编译链接阶段,成员函数的地址就已经被确定了,所以,不回去对这个指针解引用。

2023-03-24 21:31:49 308 2

原创 C++类和对象(上)

上面只是为了展示一个类如何定义,其实一般我们都是在.h文件中进行类的声明,再到.cpp文件中写函数的定义,另外,在类内定义的函数,默认在其前加上了inline。对于类,笔者的理解是:在描述一个对象的时候,我们需要描述该对象在一个问题中的属性以及该对象在该问题中所具有的交互行为。类是某个对象属性和交互行为的集合,类似于一张图纸,在写类的时候,并没有给类开辟空间,只有用这个类创建了对象之后,才会开辟空间。类的所有成员都在类的作用域中,在外部定义类中的成员时,需要使用域限定符::来指定这个成员是属于该类域的。

2023-03-20 22:08:27 210

原创 C++入门(下)

const int&是一个常引用,就可以了,其实我们可以将上述过程视为引用的权限,常量的权限最低,因为不能修改,所以将一个常量赋给int&可以视为是权限的放大,使得不能改的常量给了一个可以修改的引用,而此处权限只能平移或者缩小,就是常量只能赋给const类引用,当然,变量num也可以赋给const int& 引用,此时权限缩小。另外,没有引用之前,形参是实参的拷贝,所以相对来说,如果实参过大,那么创建形参时,就会有系统消耗,而使用用引用接收,就不会产生这么多的消耗。减少了拷贝,提高了效率。

2023-03-16 22:34:00 142

原创 C++入门(上)

C++系列

2023-02-06 15:51:11 75

原创 C语言习题——链表的回文结构

如果是数组的话,直接找到中间下标,然后用两个指针,一个指向首元素,另一个指向最后一个元素,然后同时向中间走就能判断

2022-06-01 09:26:18 256

原创 C语言栈和队列的相互实现以及循环队列的实现

1

2022-05-24 09:30:00 160

原创 C语言实现栈

引入:栈:一种特殊的线性表,只允许在固定的一端插入和删除数据。进行插入删除的一端叫栈顶,另一端叫栈底。栈中的元素遵守后进先出(Last In First Out)的原则。压栈:栈的插入操作,入数据在栈顶。出栈:栈的删除操作叫出栈,出数据也在栈顶。注:栈内的元素才遵循后进先出,数据的排列顺序多种多样。实现:建议顺序表(尾插尾删时间复杂度为O(1))。链表的话就是用双向链表或者单链表考虑头插头删,把链表倒过来。这里用的是顺序表,代码如下:Stack.h(结构体定义和函数定

2022-05-14 10:41:14 160

原创 C语言习题——使一个数字变为斐波那契数的最小步数

题目:链接:Fibonacci数列__牛客网来源:牛客网Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fib

2022-05-11 19:09:19 419

原创 C语言实现单链表

引入:对于顺序表来说,开辟的空间是连续的,可以利用下标随机访问,而且尾插尾删时,时间复杂度是O(1),但是对于头插头删,以及中间插入和删除时,因为要挪动元素,所以时间复杂度是O(n)。而且因为空间是连续的,所以malloc开辟时,一旦空间不够,那么就要在内存空间中另找一块大的空间来存放。而且容量不够时要增容,所以会有一定的系统消耗。而链表的特点:1、空间按需索取2、空间利用率提高3、不要求物理空间连续,头部和中间的插入不需要挪动数据。链表头插头删和中间插入和删除时间复杂度都是O(1)

2022-05-08 13:29:00 657

原创 时间复杂度及顺序表

引入:1、时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。因为不同的机器性能大概率是不同的,所以同一段程序可能在不同的机器上运行的时间不同,所以运行一个程序的时间不

2022-05-01 16:42:22 1571

原创 C语言程序的编译+链接

引入:1、程序的翻译和执行环境在ANSI C的任何一种实现中,存在两种不同的环境。第一种是翻译环境,在这个环境中,源代码被转化为可执行的机器指令。第二种是执行环境,它用于实际执行代码。<1>翻译环境组成一个程序的每个源文件通过编译过程分别转化为目标代码。(object code)。(Windows环境下文件后缀为.obj,Linux环境下后缀为.o)每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。链接器同时也会引入标准C函数

2022-04-26 20:36:21 2195

原创 C习题集——轮转数组

189. 轮转数组 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/rotate-array/submissions/此题有三种思路:1、思路像左旋字符串,先用一个临时变量存储把最右边的值存起来,再把剩余的元素统统向右边挪一位,再把开始存储的那个值放到首位去。这种思路虽然理论上是可行的,但很可惜,力扣上跑不过去,会超时的。2、额外开辟一个和原数组一样大的数组,先将要旋转的几个数字存进去,再把剩下的数字按次序存进去,

2022-04-23 09:15:00 448 1

原创 C语言问题集——文件操作(1)

引入: 当我们写一个程序时,数据都是在内存中的,当程序运行完毕后,程序中数据也就不存在了,或者说找不到了,如果想把数据保存下来,只有我们选择删除数据的时候,数据才不复存在,这就涉及到了程序持久化的问题,我们一般数据持久化的方法有:把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。1、什么是文件即磁盘上的文件。但在程序设计中,一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来谈的)。程序文件:包括源程序文件(后缀为.

2022-04-17 18:05:27 911

原创 C语言问题集——一些常见的动态内存使用错误

在使用动态内存时,我们往往会犯一些错误,以下是一些常见错误的整理。1、对NULL指针的解引用操作#include <stdio.h>#include <stdlib.h>#include <limits.h>int main(){ int* p = (int*)malloc(INT_MAX); if (p == NULL) { perror(""); } else { //使用 } return 0;}可见,此时mall

2022-04-15 12:45:00 796 1

原创 C语言问题集——动态内存分配(1)

引入:

2022-04-07 16:46:53 1198 1

原创 C语言问题集——结构体及其内存对齐

引入:我们知道,C语言有许多内置类型,比如char、short int 、int、long int、long long int、float、double等,但是描述我们身边的信息,只有这些数据类型是远远不够的。所以C语言有自定义类型,如数组,结构体等。结构体: <1>介绍:如果我们希望描述一个人,可能就要包括TA的名字,身高,体重,年龄,家庭住址等等。而这些信息就可以通过一个结构体变量把这些信息整合起来用来描述一个人的信息,需要用时再访问即可。#i...

2022-04-02 15:36:18 1821 2

原创 C语言问题集——字符操作函数(部分)

1、strlen2、strcpy3、strcmp4、strcat5、strstr

2022-03-30 09:34:35 740 2

原创 C语言问题集——指针进阶(2)

一、函数指针先来看一段代码:#include <stdio.h>int ADD(int x, int y){ return x + y;}int main(){ int a = 2; int b = 3; ADD(a, b); printf("%p\n", &ADD); printf("%p\n", ADD); return 0;}可以看出,函数也是有地址的,而且函数名和&函数名都是可以直接拿到函数本身的地址的那么用来接收函数地址的

2022-03-23 11:37:40 872

原创 C语言问题集——指针进阶(1)

一、字符指针通常我们使用字符指针来存放字符的地址:#include <stdio.h>int main(){ char a = 'A'; char* pa = &a; printf("%c", *pa); return 0;}像这样,pa就是一个字符指针变量。还可以这样:#include <stdio.h>int main(){ char* str = "abcdefgh"; printf("%s", str); retur..

2022-03-15 16:29:42 1031 1

原创 C语言习题——字符串旋转结果

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。有两种思路:1、每左旋一个字符,判断是否和输入的字符串相等。2、给原字符串后面追加其本身,查找输入的字符串是否为追加后的字符串的子串。给出代码:第一种方法:#include <stdio.h>#include <assert.h>#include <string.h>int Judge(char* str1, char* str2){ assert(str1 != NULL

2022-03-11 19:17:57 1196 2

原创 C语言习题——序列中删除指定数字

原题链接:序列中删除指定数字_牛客题霸_牛客网 (nowcoder.com)给出代码:#include<stdio.h>int main(){ int arr[50] = {0}; int memory[51] = { 0 };//记忆数组 int N = 0; scanf("%d", &N); int num = 0; int i = 0; for(i = 0; i < N; i++) {

2022-03-09 09:53:51 1974

原创 C语言习题——有序序列合并及空心三角形

有序序列合并:有序序列合并_牛客题霸_牛客网 (nowcoder.com)空心三角形:空心三角形图案_牛客题霸_牛客网 (nowcoder.com)有序序列合并:#include <stdio.h>int main(){ int n = 0; int m = 0; int arr1[1000] = {0}; int arr2[1000] = {0}; //输入n和m scanf("%d %d",&n,&m)

2022-03-07 11:09:41 459 1

原创 C语言问题集Chapter(3)——数据的存储

首先,一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。例如 int a = 0;即为a在内存中开辟了4个byte的空间,那么是如何存储的呢?1、原码、反码和补码。计算机中的整数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位负整数的三种表示方法各不相同。原码:直接将二进制按照正负数的形式翻译成二进制就行。反码:原码的符号位不变,其他位置按位取反得到反码。补码:反码+1

2022-03-03 13:23:55 160 1

原创 C语言习题——倒置字符串及单词倒排问题

倒置字符串原题链接倒置字符串_好未来笔试题_牛客网 (nowcoder.com)下面给出代码:#include <stdio.h>#include <string.h>void reverse(char* left, char* right){ while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; }}int

2022-03-01 09:53:01 546 4

原创 C语言问题集——指针篇(2)

2022-02-21 16:33:38 558 3

原创 C语言左旋字符串

问题:将字符串'abcdef'左旋转n个字符,打印出旋转后的字符串。例如左旋转2个字符变成'cdefab',像这样我们称之为左旋字符串。下面我们给出代码,结合代码进行说明:头文件:#include<stdio.h>#include<string.h>#include<assert.h>void left_move(char* str, int k){ int len = strlen(str); assert(k < len);

2022-02-12 17:31:58 733

原创 C语言习题——除自身以外数组的乘积

原题链接:238. 除自身以外数组的乘积 - 力扣(LeetCode) (leetcode-cn.com)这是LeetCode上的一道题,在此处我实现了它的功能,但是最后一步把所求出的数字存进一个数组没写出来,可以创建一个存储len个元素的数组,然后每求出一个ret就存进数组中去,记得设置循环变量哦!先上代码:void get_result(int* arr, int len){ int i = 0; for (i = 0; i < len; i++) { int ret =

2022-02-08 16:49:35 763 2

空空如也

空空如也

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

TA关注的人

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