自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 【Linux从入门到放弃】Linux编辑器——vim的使用

当我们学习 Linux 开始编程时,就需要一个开发工具,对于刚开始学习 Linux 的我们最适合使用 vim 编辑器。vim 文本编辑器,是由 vi 发展演变过来的文本编辑器,它们都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 vi 的所有指令,而且还有一些新的特性在里面。比如语法加亮,可视化操作不仅可以在终端运行,也可以运行于 x windows、mac os 、windows。

2023-01-07 20:09:44 1529 37

原创 【数据结构】八大排序算法详解

在日常生活中,我们经常需要对收集到的各种数据进行处理,这些数据处理中用到的核心运算就是排序。例如,手机App中的各种排行榜,每年都会有的全国高校排行榜等等,它们都是按照一定的规律来进行排序的。目前已有上百种排序算法,此篇博客将介绍几类经典而又常用的排序算法,包括基本的算法思想、实现代码及性能分析。所谓排序,就是将待排序文件中的记录按照其中的某个或某些关键字的大小,递增或递减的排列起来,即将一组无序的记录序列调整为有序的记录序列。

2022-12-15 17:56:09 1663 51

原创 【Linux从入门到放弃】Linux权限详解(用户权限、文件权限、权限设置)

  生活当中处处存在着有关权限的案例,比如:在腾讯视频、爱奇艺视频这样的视频软件上面总会有许多的VIP电视剧或者电影,只有你充值了对应的会员才可以观看;王者荣耀上有着许多好看的皮肤,但是只有你花钱购买了它才可以穿在你对应的英雄身上。这种就可以认为权限是限制人的行为的。  除此之外,你去西餐厅给人家服务员说给我上一道麻婆豆腐;你在五金店给人家老板说给你装上三斤橘子;你要在腾讯视频里敲代码。很明显这些都是不可能的,而这也是一种权限,这种权限代表的是你所访问的对象根本没有这种“属性”。  总的来说,权限 =

2022-12-06 18:14:19 1499 48

原创 【数据结构】二叉树详解(下篇)

上一篇文章主要讲解了关于二叉树的概念、性质以及顺序结构的实现,此篇文章将继续完成堆的应用、二叉树的链式结构介绍以及相关操作实现。至此就基本完成了对二叉树的学习,主要还是要明白二叉树的性质,堆的创建、排序和TOPK问题,核心内容就是要明白向下调整算法以及向上调整算法的实现(这些都是建立于二叉树是完全二叉树的基础之上)。再者就是熟悉二叉树的遍历算法,主要是前中后序遍历,层序遍历的实现稍微有点难度,以及二叉树的有关操作(递归实现)。

2022-11-30 21:42:33 888 43

原创 【Linux从入门到放弃】Linux基本指令大全

  语法:   功能:显示当前目录下的文件列表(普通文本文件、目录等等)  常用选项:当然以上指令的选项都可和在一起使用,选项的先后顺序没有差别。  功能:显示用户当前所在的目录当你使用该指令所打印出来的信息就表示当前用户现在所处的路径。  语法:  功能:改变工作目录。将当前工作目录改变到指定的目录下  语法:  功能: 创建一个名叫 test.txt 的空文件(在当前目录下)  语法:  功能:在当前目录下创建一个名为 “dirname”的目录  rmdir 是一个与 mkdir 相对应的

2022-11-27 19:09:27 6717 60

原创 【数据结构】二叉树详解(上篇)

本文将主要对树、二叉树的相关概念和性质展开讲解,同时用代码实现一种特殊的二叉树(堆)的顺序存储实现。树是一种非线性的数据结构,它是由 n(n >= 0)个有限结点组成一个具有层次关系的集合。当 n = 0 时,称为空树。① 有且仅有一个特殊的点称为根结点,根结点没有前驱结点;② 当 n > 1 时,其余结点可分为 m(m > 0)个互不相交的有限集 T1、T2、……、Tm,其中每个集合本身又是一棵树,并且称为根的子树。

2022-11-23 22:19:29 888 48

原创 【牛客网】链表中倒数第k个结点、CM11 链表分割、OR36 链表的回文结构

输入一个链表,输出该链表中倒数第k个结点。  对于这道题,同样通过快慢指针的思想去解决,但是这个快指针不是每次向后移动两步,而是先让快指针走上步,然后快慢指针再同时移动,当快指针指向空的时候慢指针指向的结点刚好为所要找的结点。除此之外,还要考虑到一些特殊情况,比如只有三个结点,却要返回倒数第四个结点;或者返回倒数第零个结点。二、链表分割  现有一链表的头指针 ,给一定值 ,编写一段代码将所有小于 的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。  对于这道题,有两种解

2022-11-19 21:45:51 722 47

原创 【数据结构】我家三岁表弟都明白的栈和队列,你不会不了解吧?

以上为对栈和队列的介绍,一定要注意最开始对其的初始化条件:比如栈的top指针到底指向哪里非常关键。相对来说栈与队列理解起来也比较轻松,主要是明白它们各自的属性特征。文章若有不足的地方还请大佬指正!!!

2022-11-14 22:55:59 842 55

原创 【LeetCode】移除链表元素、反转链表、链表的中间节点

  给你一个链表的头节点 和一个整数 ,请你删除链表中所有满足 的节点,并返回 新的头节点 。  对于这道题,定义一个当前指针从第一个结点开始比对,那么就会有两种情况:第一种情况为当前结点不是要移除的结点,则将当前指针向后移动进行下一个结点的比对;第二种情况就是当前结点是要移除的结点,对于这种情况还要分为两种,一种就是该结点为链表的第一个结点,只需将链表头指针和当前指针同时向后移动即可,另一种就是为链表中结点,则需要让被移除结点的前驱结点指向它的后继结点,由于此链表为单链表,当你找到链表中要被删除结点

2022-11-11 16:17:27 327 40

原创 【数据结构】原来你叫“带头结点的双向循环链表”啊

上篇博客带大家认识了单链表,单链表结点中只有一个指向其后继的指针,使得单链表只能从头结点依次向后遍历。对于插入、删除操作得从头遍历,尤其是在链表尾部,还有一点就是无法一步的访问到某个节点的前驱节点,也就是说访问前驱节点的时间复杂度为O(n)。为了避免这样的缺点,便引出了双向循环链表首先,它是一个链表,通过指针将所有的结点连接在一起;其次,循环链表表示整个链表从头到尾构成一个环,链表尾结点的next指针指向头结点;再者,双向表示链表结点有两个指针prev和next,分别指向其前驱结点和后继节点;

2022-11-08 19:06:51 1832 64

原创 【数据结构】单链表——单链表的定义及基本操作的实现(头插、尾插、头删、尾删、任意位置的插入与删除)

顺序表可以随时存取表中的任意一个元素,它的存储位置可以用一个简单直观的公式表示,但是插入和删除操作需要移动大量元素。链式存储线性表时,不需要使用地址连续的存储单元,即不要求逻辑上相邻的元素在物理位置上也相邻,它通过“链”建立起数据元素之间的逻辑关系,因此插入和删除操作不需要移动元素,而只需要修改指针,但也会失去顺序表可随机存取的优点。线性表的链式存储又称为单链表,它是通过一组任意的存储单元来存储线性表表中的数据元素。

2022-11-04 20:46:29 896 65

原创 【LeetCode】移除元素、删除有序数组中的重复项、合并两个有序数组

给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。提示:首先要明白的是,该题目给定一个数组,删除题目给定的数组中存在的数字,并将删除后的数组元素个数进行返回,还有就是将非删除的元素进行往前挪动,因为改题目在自测时会根据你返回的数组元素个数进行访问,并不会去管数组后面的几个数字是多少。对于该题目,我们可以通过循

2022-11-01 10:46:35 1019 56

原创 【数据结构】线性表之顺序表详解

数据的逻辑结构分为线性结构和非线性结构,线性结构中的线性表根据存储结构又分为顺序表和链表。这篇博客主要讲的是顺序表的定义和基本操作,以及它是如何实现的。线性表是具有相同数据类型的n (n>=0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

2022-10-28 20:50:18 1207 42

原创 【数据结构】什么是时间复杂度、空间复杂度?看此篇文章足矣

在数据结构中,有着众多的算法,比如查找算法,排序算法等。在查找算法中有顺序查找、折半查找、分块查找等,排序算法中有冒泡排序、快速排序、希尔排序等,而面对这么多的算法,是怎样去衡量算法的执行效率呢?而这也就是此篇文章的重点:时间复杂度和空间复杂度。

2022-10-24 15:16:09 2100 52

原创 【数据结构】什么是数据结构?

此篇文章旨在对数据结构做一个初步认识,了解数据结构相关的概念和术语以及它的三要素。以上为学习数据结构的基础知识,也不是说非得熟知这些知识,只要你对于这些有一定的了解,那么对于后续的数据结构知识学习有一定的帮助。

2022-10-23 17:52:46 489 43

原创 【C语言】让你不再因为指针而感到头疼

想必对于很多刚接触C语言的同学来说关于指针的知识点很头疼,就感觉跟树枝一样错综复杂,最终搞得自己不知道指针该指向哪里,此片文章就对指针做一个详细介绍,希望能够帮到你!在计算机科学中,指针是编程语言中的一个对象。指针是内存地址,指针变量是用来存放内存地址的变量,利用内存地址可以直接指向存在电脑存储器中的那块内存单元,从而能找到所需的变量单元,也就是说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。//在内存中开辟一块空间 int * p = & a;

2022-10-18 17:24:10 1053 39

原创 【牛客网】数组中值出现了一次的数字

接下来就将所有的数字左移 x 位进行判断是否为 1 而被分组,最后将这两个组的数据分别进行异或各自得到的数字就为那两个出现奇数词的数字。输入包含两行,第一行一个整数n(1≤n≤10^5),代表数组arr的长度,第二行n个整数,代表数组arr,arr[i]为32位整数。将所有的数字进行异或,得到的数字二进制的某一位(假设第 x 位)肯定为 1 ,而这个 1 就可以作为分组的标准。,对于这道题,可以将所有的数字分成两组,而两个出现奇数词的数字刚好会被分在不同的组内,输出出现奇数次的两个数,按照从小到大的顺序。

2022-10-16 17:16:50 520 16

原创 【C语言】自定义类型(结构体,位段,枚举,联合)

int x;int y;} p1;//声明类型的同时定义变量p1 struct Point p2;//定义结构体变量p2 //初始化:定义变量的同时赋初值。x , y };struct Stu //类型声明 {//名字 int age;//年龄 };//初始化 struct Node {int data;

2022-10-16 11:31:13 100 6

原创 【C语言】atoi函数模拟实现

基本上该函数的模拟实现要注意的细节都在上面的代码注释里。还要再解释的是为什么要将返回值定义成 long long 长整型,而不是stoi函数的返回值 int 型呢?这是因为在计算求和的时候万一出现越界,由于之前将返回值定义为 int 型,这时就会将已经越界的数字强制转换为非越界的数字,那么就会导致错误的输出结果和错误的合法性判断。

2022-10-15 18:27:22 737 39

原创 【C语言】通讯录管理系统(文件版本)

之前写过两个版本的通讯录管理系统,存在一个缺陷就是所有的用户信息的临时的,当关掉程序后所有的用户信息都会丢失掉,为了使用户信息一直保存在文件当中,可以使用相关的文件操作的动态管理系统进行改进。

2022-10-12 16:41:19 677 30

原创 【C语言】文件操作(超详细讲解)

计算机文件,属于文件的一种,与普通文件载体不同,这类文件是以硬盘为载体存储在计算机上的信息集合。在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。此片文章内容是针对于数据文件。

2022-10-11 23:09:51 188 26

原创 【C语言】函数栈帧的创建与销毁

随着不断地学习C语言,相信每个人都可能存在着一些疑惑?1.局部变量是怎么创建的?2.为什么局部变量的值是随机值?3.函数是怎样传参的?传参的顺序是怎样的?4.形参与实参是什么关系?5.函数调用是怎样做的?6.函数调用结束后怎样返回的?这篇文章所使用的环境是VS2013,在不同的编译器下,函数调用过程中栈帧的创建与销毁是有所不同的,具体细节取决于编译器的实现,当然大体逻辑结构都是类似的。

2022-10-05 12:05:05 909 28

原创 【牛客网】反转数字

1.为什么要将返回值 ret 定义成 long long 型是因为存在反转数字太大,若只设置四个字节会超出这个范围的最大数字或最小数字,最终只会将这个数字的后32个比特位截取然后赋值给 ret ,那么在最后的输出结果会不满足示例4。为了避免这个警告,我们可以在最后返回语句上对 ret 进行强制类型转换,当然这个做法是不会产生问题的,因为既然能执行这一步那肯定该数字是在 [−231, 231 − 1]范围内的。给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果。

2022-10-04 17:58:08 369 7

原创 【C语言】扫雷游戏(超详细)

之前基于二维数组写过一个三子棋的小游戏,现在又可以完成一个小游戏——扫雷(9阶)。大概思路如下:1.首先创建一个菜单选项,选择 ‘1’ 进入游戏,选择 ‘0’ 退出游戏;2.初始化两个相同的棋盘,一个为mine棋盘,一个为show棋盘(两棋盘同为十一行十一列);mine 棋盘是有关雷的棋盘,有雷的位置初始化为 ‘1’,没有雷的位置初始化为 ‘0’,玩家不可见;show棋盘属于打印棋盘,最初全部初始化为 ‘*’,在排雷的过程中打印出来的show棋盘上的数字表示该点周围雷的总数。

2022-10-03 19:17:27 1125 18

原创 【C语言】人机对弈——三子棋

当C语言学到二维数组的时候,我们便可以写一个小小的游戏了——三子棋。大概思路如下:首先给到玩家一个选择的界面,选择1开始玩游戏,选择0退出游戏,若是其他数字必须重新输入;当开始了游戏之后,界面会输出一个三行三列的棋盘,第一步玩家先走,走完之后进行判断是否赢棋,若没有则电脑下棋,同样也要进行判断是否赢棋,直到一方赢棋;若最终期盼已满还未分出胜负则表示为和棋。

2022-09-29 18:26:00 987 24

原创 【C语言】动态通讯录管理系统

之前写过一个初级的通讯管理系统,里边对于通讯录的容量是提前设置好的,这有一个坏处就是当容量达到最大值时就无法再添加信息。所以为了解决这样的问题,可以选择动态内存函数进行动态管理,在必要时自主增添容量。C语言通讯录管理系统C语言动态内存管理。

2022-09-26 20:10:56 326 15

原创 【C语言】设计程序判断电脑大小端模式

首先我们看一下数据在内存当中的存储。将数字 a 转化为16进制:0X00000001,而在内存当中我们可以清楚的看到刚好是相反的存放着。这是为什么呢?接下来将介绍大小端的概念并对其解惑。大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

2022-09-21 23:28:06 330 7

原创 【C语言】通讯录管理系统

通过使用C语言来创建一个通讯录的管理系统,管理人员可对成员信息进行管理。成员信息包括姓名、年龄、电话、性别以及住址,执行操作有增删改查这四项基本操作以及成员信息全览和信息排序。

2022-09-21 20:44:15 767 2

原创 C语言内存函数详解

若想实现在 arr1 这样的一个数组里,将(1,2,3,4,5)拷贝到(3,4,5,6,7)的位置上就会出现错误,最终的执行结果会是(1,2,1,2,1,2,1,8,9,10)。为什么会有这样的结果,原因就在于将arr[0]和arr[1]的元素拷贝到arr[2]和arr[3]的位置上,此时的arr[2]和arr[3]的值已经发生了变化,你再将arr[2]的值拷贝到arr[4]时不是拷贝的数字三,而是数字一。①:和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

2022-09-19 15:26:58 218 1

原创 C语言strstr函数与strtok函数详解

strstr() 函数与 strtok() 函数都属于字符串查找函数。

2022-09-17 11:39:56 263

原创 C语言strcat、strncat函数详解

首先,dest 和 src 指针都指向字符串的首地址,当 dest 指针走到字符串末尾 ‘\0’ 处就开始了追加操作,那么字符串的首个元素就会将 ‘\0’ 覆盖 ,而这个函数的结束条件是 src 指针找到源字符串的 ‘\0’ ,但是,由于在追加操作的第一步已经将 ‘\0’ 覆盖,所以说根本就找不到结束标志,所以程序就会进入死循环。目标中的终止空字符被源字符串的第一个字符覆盖,并在目标中两者的连接所形成的新字符串的末尾追加一个新的空字符。②:目标空间必须足够大,以确保能存放源字符串,否则将会导致内存泄漏;

2022-09-15 16:40:44 291

原创 C语言strcpy、strcnpy函数详解

①:源字符串必须以 ‘\0’ 结束,因为在拷贝的过程中是以找到源字符串中的 ‘\0’ 为止。②:若 num 小于等于源字符串长度且小于等于目标空间字符串长度,则不会添加 ‘\0’。①:若源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个;③:目标空间必须足够大,以确保能存放源字符串,否则将会导致内存泄漏。源字符串(被拷贝的字符串),const 表示该字符串无法被修改;①:将源字符串中的前 num 个字符拷贝到目标空间当中;②:会将源字符串中的 ‘\0’ 拷贝到目标空间。

2022-09-11 23:00:15 345

原创 C语言strlen函数详解

2.注意事项①字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ ); 例:输出结果:②参数指向的字符串必须要以 ‘\0’ 结束;  例如字符串的定义形式是这样:  输出结果会是一个随机值,因为在这个字符数组当中不知道 '\0’在何处。③函数的返回值为size_t,是一个无符号类型的数字。  此条事项是最容易忽视的,是一个易错点。例:  为什么会出现这样的结果,原因就在于:str1 的长度是 7,str2 的长度是 4,在

2022-09-11 19:29:21 1675

原创 C语言qsort函数的使用详解

qsort()函数是C语言库函数中的一种排序算法,其用到的排序思想是快速排序(quicksort)。它的独特之处在于可以排序任意类型的数组元素(整形、浮点型、字符串和结构体类型)。

2022-09-05 11:52:16 2293 1

原创 C++类(继承的基础知识)

1.继承的概念与定义1.1继承的概念  继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许在其原有的类特性上进行扩展,增加功能,这样产上的新类称为派生类(子类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承是类设计层次的复用。class Base//基类(父类){public: void Print() { cout << "Print()" << endl; cout << _b << endl;

2020-12-10 17:34:11 197

原创 linux---fork函数

1. 初识fork函数  fork函数是从已经存在的进程中创建出一个新的进程。新进程为子进程,原进程为父进程。#include <stdio.h>#include <unistd.h>int main(){ pit_t pid = fork(); return 0;}  返回值: 子进程返回 0,父进程返回子进程 id,如果出错返回 -1。进程调用fork函数,当控制转移到内核中的fork代码后,内核会这样做:...

2020-11-26 18:00:51 197 1

原创 (C++)栈的压入、弹出序列

  输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出列。(注意:这两个序列的长度是相等的)class Solution {public: bool IsPopOrder(vector<int> pushV,vector<int> popV) {

2020-11-13 17:16:57 149

原创 C++字符串的深浅拷贝

1.浅拷贝class string{public: //string(const char* str = "\0") 错误示范 //string(const char* str = nullptr) 错误示范 string(const char* str = "") { // 构造string类对象时,如果传递nullptr指针,认为程序非法,此处断言下 if(nullptr == str) { assert(false); return; } _str

2020-11-08 17:41:51 631

原创 C++:STL之String类(接口)

STL:C++中的标准模板库  简单来说就是对常见数据结构的封装(容器),增加常见通用类型的算法(灵活)。  STL的内容:    容器:数据的仓库    算法:与数据结构相关的算法、通用的算法(和数据结构无关)    迭代器:算法和容器的连接    适配器:类似于转接线,苹果线要连接安卓线(stack,queue)    仿函数:使函数的功能更加灵活    空间配置器:专门用来进行空间申请/释放的,对空间进行管理   容器:对常见数据结构的封装。   序列式容器—线性的数据结.

2020-11-07 22:28:38 248

原创 C++——模板介绍:函数模板,类模板

一. 泛型编程假如要实现一个通用的加法函数,我们可以用函数重载的方式来实现。 void Add(const int& a,const int& b) { return a+b; } void Add(const double& a,const double& b) { return a+b; } void Add(const char& a,const char& b) { return a+b; }使用函数重载虽然可以实

2020-10-18 16:24:19 278 1

空空如也

空空如也

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

TA关注的人

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