- 博客(43)
- 收藏
- 关注
原创 文件编辑器vim的使用和介绍
1.vim的安装首先我们打开一个终端直接输入vim,如果电脑没有安装vim 的话会提示你通过以下代码去安装vim,代码会给你提示在屏幕上,输入代码回车即可安装,现在说一下安装失败的解决方法。一般来说安装失败的话我们只需要更新一下软件源即可,命令如下:apt updata:更新标准软件源 或者 apt -get updata:更新标准软件源更新好了后再通过刚才屏幕显示的代码进行安装即可。2.vim的三种模式介绍三种模式:命令模式 插入模式(编辑模式) 末行模式模式直接切换的示意图:
2022-05-05 17:17:49 138
原创 Linux常用命令介绍
1.基础命令1.pwd:显示当前位置的绝对路径2.cd切换目录,cd 后面添加的参数是目的地(可以是相对路径也可以是绝对路径)cd '-' 返回到上一次目录所在地cd '~' 直接回到用户家目录cd '.' 无事发生cd '..' 回到上一层3.ls:显示目录下所有文件ls -a 显示隐藏文件ls -l 用列表的方式显示所有文件的详细信息4.man :帮助手册,用来查看命令,系统调用,库函数的详细信息唯...
2022-04-27 22:28:45 527
原创 Linux界面介绍及基础知识
我们这里用的是Ubuntu系统,刚开始进去的界面是这样的:1.开关机开关机尽量从这里进行:2.终端的打开方法1:Ctrl +Alt+ t方法2:鼠标右键,在终端中打开my:用户名(我在安装虚拟机是自定义的)my-virtual-machine:主机名/桌面:当前所在目录的路径$:普通用户#:超级用户(管理员)3.怎么控制终端的大小 扩大:ctrl shift ‘+’缩小:ctrl ‘-’进入管理员权限:sudo su退出管理员权.
2022-04-18 00:27:19 5851
原创 暴力求解(BF算法)和KMP算法
在字符串匹配的时候,我们经常用到BF算法和KMP算法。首先一张图了解子串和真子串:子串比真子串多了一个字符串本身。比如我们在主串"ababcabcdabcde"中找到子串"abcd",从头开始查找返回的下标为5,从下标7号位置查找则返回下标9.BF算法:首先我们需要定义两个整形值 i 和 j ,分别指向两个字符串的0号下标位置。如果 i 和 j 指向的字符相同,则 i++, j++。如果 i 和 j 指向的字符不相同,则,i=i-j+1,j=0;(i指向上一次开始位置的下
2022-04-11 18:12:44 1385
原创 归并排序/快速排序
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。代码如下://一次融合函数 时间复杂度O(n) 空间复杂度O(n)void Merge(int arr[], int len, int gap){ int low1 = 0; int high1 = low1+gap-1; int low2 = high1+1; int high2 = low2+gap-1<len ? low2+gap-1 : len-1; int *brr = (int*)malloc.
2022-04-11 07:00:00 94
原创 冒泡排序/堆排序
冒泡排序:每一趟循环两两比较,大的向后挪动,最终最大值放在最后,n个数据需要跑n-1趟。代码如下://冒泡排序 时间复杂度O(n^2) 空间复杂度O(1) 稳定性:稳定void BubbleSort(int* arr, int len){ assert(arr != NULL); for (int i = 0; i < len-1; ++i) { for (int j = 0; j < len - 1 - i; ++j) { if (arr[j+1.
2022-04-10 10:00:00 463
原创 直接插入排序/希尔排序
八大排序:直接插入排序,希尔排序,冒泡排序,选择排序,堆排序,二路归并排序,快速排序,基数排序。我们这篇文章主要讲直接插入排序和希尔排序,其实懂了直接插入排序,希尔排序也就懂了,所以先来说直接插入排序。直接插入排序(可以想象成我们打牌时接扑克牌一样)。我们先给出原始数据:12,2,9,8,18,7。加下划线是已经排序好的(有序队列),没加是未排序的,第一趟排序可以省略。调整规则:将待插入的值(也就是有序队列最后一位的下一位)和有序队列的所有值挨个比较(从右到左),找到一个小于或者等于
2022-04-09 13:29:58 880
原创 一致性哈希,虚拟节点,布隆过滤器
假设上图A,B,C是三台服务器,现在有6万张图片,为了平均分配在每个服务器上,我们按以下方式存储:提取图片关键字%服务器个数(3)余数为0的存放在A服务器,余数为1的存放在B服务器,余数为2的放在C服务器假设我们现在再添加一台服务器D,那么就会发生:6%3=0,6%4=2,本来在A服务器的照片,变成了C服务器。由于服务器发生了变化,导致服务器中的数据受到影响(全部数据)于是我们将三台服务器想象成一个环状:这是一个圆形,我们认为这个圆上存在无数个点,现在假设这个圆...
2022-04-09 12:40:12 119
原创 数据结构——哈希
在学习哈希之前,我们思考这样一个问题,在下面的数组中,我们想在第一时间内确定一个数是否在这个数组里面(以35为例),我们应该如何做? 大家的第一想法肯定是从前向后遍历一遍,但我们会发现从前向后遍历一遍的时间复杂度为O(n),这并不是我们想要的第一时间内找到,我们观察数组,发现,数据和数组下标(也就是存储位置)没有任何关系,如果数据和它的存储位置有一个对应的关系,我们就可以通过数据和对应关系直接找到这个数据的存储位置,再判断数组存储的这个数和我们想要的数(35)是否相等,就可以得出35在不在数组中。我们给
2022-04-08 16:53:57 850
原创 如何用两个队列模拟实现一个栈
q1和q2分别是一个队列(链队列),用两个队列模拟实现一个栈的规则如下:如何入栈:直接向q2里边入。如何出栈:如果q2不空,将q2除了最后一个数据外,剩余数据放到q1里,这个时候q2仅仅剩下一个数据,这个时候就可以出来。如果q2为空,代表着数据都在q1里,将q1除了最后一个数据外,剩余数据放在q2里,这个时候q1只剩下最后一个数据,直接出即可。注意:下边的代码需要链队列能实现的相关函数,链队列文章链接如下:(34条消息) 数据结构——队列(链队列)_张淑芬~的博客-CSDN博..
2022-04-08 15:54:32 3009
原创 如何用两个栈模拟实现一个队列
s1和s2分别是两个栈,用两个栈实现一个队列的规则如下:如何入队: 入队只向s1里面入队如何出队: 看s2里面有没有值,有的话,直接出即可 s2里面没有值,为空怎么办? 将s1里面的值,全部颠倒存放到s2,这时候s2就不空了,则直接出即可这里需要函数调函数,所以需要栈能够实现的相关函数,这里把链接如下,需要结合一起看。(35条消息) 数据结构——栈(顺序栈)_张淑芬~的博客-CSDN博客用两个栈模拟实现的队列的结构体设计://用两个栈模...
2022-03-21 22:30:37 2094
原创 数据结构——队列(链队列)
链队列图示:头结点需要两个指针域(一个指向头元素,一个指向尾元素),不需要数据域,所以头结点单独设计。链队列头结点设计://头结点的结构体设计:typedef struct LQueue{ struct Node* front; struct Node* rear;}LQueue, * PLQueue;链队列有效结点设计://链队列的结构体设计typedef int ELEM_TYPE;//有效数据节点的结构体设计:typedef struct Node{.
2022-03-19 16:02:05 988
原创 数据结构——队列(循环队列)
队列:也是一种受到限制的线性表,一端进行入队,另一端进行出队,我们将入队的一端一般称作队尾,另一端称作队头。特点:先进先出。那么顺序表实现的队列为什么叫做循环队列?
2022-03-16 15:35:09 1854
原创 数据结构——栈(顺序栈)
栈的概念:只能在表尾进行插入(入栈)和删除(出栈)的数据结构(受到限制的线性表)。表尾比较特殊,我们一般把这个表尾叫做栈顶,另一端栈底。没有数据节点,则叫做空栈特点:先进后出(FILO)a1最先进栈,a1最后出栈。为了更好的理解,可以想象生活中的例子:子弹弹夹直接给出栈的结构体定义:(结构体中需要三个成员)#define INIT_SIZE 10typedef int ELEM_TYPE;typedef struct Stack{ ELEM_TYPE* base;//一个
2022-03-11 17:52:16 3594
原创 数据结构——双向单链表
首先搞清楚双向链表和单链表的区别:双向链表比单链表多出一个指针域,保存上一个结点的地址双向链表:和单链表相比,双向链表有两个指针域,既可以右边的结点地址(后继),也可以保存左边的结点地址(前驱)如果是一个空的双向链表,则它的next和prior同时指向NULL即可双向链表的结构体设计://双向链表结构体设计:typedef int ELEM_TYPE;typedef struct Dlist{ ELEM_TYPE data;//数据域 保存有效值 st
2022-02-21 14:49:38 718
原创 循环单链表
循环链表:和单链表相比,尾结点的next域不在指向NULL,而是指向头结点循环链表的结构体声明和单链表一样://循环链表结构体设计typedef int ELEMTYPE;typedef struct Clist{ ELEMTYPE data; //数据域 存放数据 struct Clist* next;//指针域 存放下一个节点的地址(尾结点的next保存头结点的地址)}Clist, * PClist;...
2022-02-20 13:09:07 869
原创 单链表(不带头结点)
单链表不带头结点结构体设计://不带头结点的结构体设计:typedef int ELEM_TYPE;//有效数据节点结构体设计typedef struct Node{ ELEM_TYPE data;//数据域 (1.头结点:不保存任何数据 2.有效数据节点:保存有效值) struct Node* next;//指针域 (1.头结点:保存第一个元素的地址 2.有效数据节点:保存下一个有效元素的地址)}Node, * PNode;老规矩,实现链表的基本功能:增删
2022-02-19 13:40:36 6096
原创 数据结构单链表(带头结点)
因为头结点的数据成员只有一个:指针域,而有效数据节点里的数据成员不仅有数据域还有指针域,所以,直接用有效数据节点当做头结点单链表结构体设计(包含了两种方法)://有效数据节点结构体设计(头结点借用)typedef struct Node{ ELEM_TYPE data;//数据域 (1.头结点:不保存任何数据 2.有效数据节点:保存有效值) struct Node* next;//指针域 (1.头结点:保存第一个元素的地址 2.有效数据节点:保存下一个有效元素的..
2022-01-18 16:41:52 1171
原创 不定长顺序表(C语言)
结构体定义:#define Maxsize 10typedef int ElemType;typedef struct Dsqlist{ ElemType* elem;//指针,接受malloc返回值 int length;//有效长度 int list_size;//存放一个整型值,这个变量用来存储最大容量空间个数,以格子为单位}Dsqlist, * PDsqlist;不定长顺序表可以实现的功能://初始化void Init_Dsqlist(struct Dsqlist
2022-01-12 21:43:12 399
原创 定长顺序表(数据结构)
结构体设计:#define MAX_SIZE 100typedef struct sqlist{ int arr[MAX_SIZE];//存放有效数据,静态数组1 int length;//存放有效长度}sqlist,*Psqlist;结构体设计好之后,我们就要实现一些功能:增删改查头文件里的函数声明://初始化void Init_sqlist(struct sqlist* p);//void Init_sqlist(Psqlist p);//按位置插入boo...
2022-01-10 18:13:21 90
原创 函数的递归讲解
什么是函数的递归:在调用函数的过程中又出现直接或间接地调用该函数自己本身,称为函数的递归。什么意思呢?我们以一道题为例:求n的阶乘。int Fac(int n)//n的阶乘{ int sum=0; if (n == 0||n==1)//1的阶乘和0的阶乘都为1,特殊值处理 { sum = 1; } else { sum =n* Fac(n - 1); } return sum;}int main(){ printf("%d", Fac(5));//这里按5的阶
2021-12-01 16:26:01 221
原创 用malloc开辟二维数组的三种办法
第一种办法:用指针数组;首先看一下原理图(以开辟整型二维数组三行四列为例,以下都是):先看一下用malloc申请一维数组:int *p=(int *)malloc(10*sizeof(int));//开辟10个内存空间1.首先申请三个指针数组(不是数组指针)int *,既然是指针数组,存放的都是指针,那么我们就可以在此基础上继续开辟4个内存空间。代码如下:int main(){ int** p = (int **)malloc(3*sizeof(int*));//申请指针数.
2021-11-29 15:24:25 12321 1
原创 变量和内存总结
变量和内存总结:局部变量:定义在函数内部的变量 普通局部变量: 静态局部变量:全局变量:定义在函数外部的变量 //很危险,尽量不要用 普通全局变量: 静态全局变量:static(静态):改变变量或者函数的生命周期,内存区域,默认值,链接属性...
2021-11-25 17:30:57 89
原创 指针详解(一)
指针:等同于地址,定义:数据类型*指针名 int *p或int* p* 号:1.定义指针的时候,类型说明符 2.通过*号 地址,可以访问到真实内存 3.四则运算的乘号 *号前两中情况怎么区分?在指针定义的时候,表示类型说明。&号:1.取地址符号 2.位操作符号初始化:int *p=&a;int main(){ int a = 10; int b = 20; int* p; ...
2021-11-25 13:39:48 516
原创 一维数组详解
数组:处理批量数据的(数组是一堆类型相同的变量集合)一般表现形式:数据类型+数组名+[长度]i#include<stdio.h>int main(){ int a; int arr[10];//数组定义 值为随机值 int brr[10] = { 1,2,3,4,5,6,7,8,9,10 };//赋值 int crr[10] = { 1,2,3,4,5 };//后边剩余没有给的统一为0 int drr[] = { 1,2,3,4,5 ...
2021-11-25 13:27:27 390
原创 身份证校验是否正确
判断方法:1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2 ;2、将这17位数字和系数相乘的结果相加;3、用加出来和除以11,看余数是多少;4、余数只可能有0、1、2、3、4、5、6、7、8、9、10这11个数字。其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2,其中的X是罗马数字10;5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ;如果
2021-11-01 16:31:19 1225
原创 猴子吃桃问题
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少个桃子?#include<stdio.h>int Sss(){ int n=1,t=1; while (n < 10) { t = (t + 1) * 2; n++; } return t;}int main(){int sum2 = Sss()
2021-11-01 16:21:23 65
原创 有一个分数序列2/1,3/2,5/3,8/5,13/8,21/13,···求出这个数列的前20项和。
#include<stdio.h>double S_sum(int n){ double i = 1, j = 2; double sum = 0; for (int m = 1; m <= n; m++) { sum += j / i; double temp = i + j; i = j; j = temp; } return sum;}int main(){double sum1 = S_sum(20); printf("%f\n", su.
2021-11-01 16:17:15 927
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人