自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【编程题】——移除元素

题目:给定一个整形数组,删除其中等于val的元素,然后返回删除后的数组代码:# include<iostream># include<vector># include<iterator>using namespace std;void removeElement(vector<int>& nums, int val) ...

2019-08-27 14:13:19 259

原创 【编程题】——判断一个单向链表是否形成了环形结构

题目:判断一个单向链表是否形成了环形结构。思路:定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环形链表;如果走得快的指针走到了链表的末尾(next指向NULL)都没有追上第一个指针,那么链表就不是环形链表。代码:# include<iostream>using namespace std...

2019-08-26 14:17:07 572

原创 【编程题】——求链表的中间节点

题目:求链表的中间结点。如果链表中结点总数为奇数,返回中间结点;如果结点总数是偶数,返回中间两个结点的任意一个。思路:定义两个指针,一个指针一次走一步,另一个指针一次走两步,当走得快的指针到达链表末尾的时候,走得慢的指针刚好达到链表的中间节点。代码:# include<iostream>using namespace std;struct ListNode{ ...

2019-08-26 14:08:16 455

原创 【编程题】——求链表倒数第k个节点

解题思路:设置两个指针,将第一个指针指向链表的头结点,第二个指针保持不动,先让第一个指针走到第k个节点处,此时将第二个节点从链表的头结点开始走,当第一个指针走到链表的NULL位置时,第二个指针的位置就是倒数第K个节点的位置。代码:# include<iostream>using namespace std;struct ListNode{ int key; Li...

2019-08-26 13:43:50 299

原创 【数据结构】——希尔排序

一、算法思想希尔排序采用跳跃式分组(逻辑上分组)的策略,通过某个增量将数组元素划分为若干组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。平均时间复杂度:O(nlogn)空间复杂度:O(1)稳定性:不稳定下面举例图解:将图中的15个数字划分为5组,每组3个数字,然后进行排序。组内排序时是将每组...

2019-08-25 12:49:54 552

原创 【数据库】——触发器

触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如 当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器和存储过程的区别:(1)触发器主要时通过事件进行触发而被执行的。(2) 存储过程可以通过存储过程名字...

2019-08-25 11:41:35 1155

原创 【数据库】——索引

一、概念索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。在没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序...

2019-08-24 20:26:00 262

原创 【数据库】——事务

一、概念事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。二、四个特性1、原子性(atomicity):一个事务的执行被视为一个不可分割的最小单...

2019-08-24 16:59:05 301

原创 【数据库】——MYSQL存储引擎

数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用存储引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多的数据库管理系统都支持多种不同的存储引擎。MySQL的核心就是存储引擎。使用 show engines 命令查看MySQL支持的存储引擎。下面介绍四种我熟悉的存储引擎:一、...

2019-08-24 16:00:33 231

原创 【Linux】——压缩算法

一、LZ77算法1、压缩原理如果文件中有两块内容相同的话,那么只要知道前一块的位置和大小,我们就可以确定后一块的内容。所以我们可以用(两者之间的距离,相同内容的长度)这样一对信息,来替换后一块内容。由于(两者之间的距离,相同内容的长度)这一对信息的大小,小于被替换内容的大小,所以文件得到了压缩。简单的讲,LZ算法被认为是字符串匹配的算法。例如:在一段文本中某字符串经常出现,并且可以...

2019-08-17 15:29:47 904

原创 【C++】—— 常见的内存错误及其对策

1、内存分配未成功,却使用了它。编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是, 在使用内存之前检查指针是否为 NULL。如果指针 p 是函数的参数,那么在函数的入口 处用assert(p!=NULL)进行检查。如果是用malloc或 new来申请内存,应该用if(p==NULL) 或 if(p!=NULL)进行防错处理。2、内存分配虽然成功,但是尚未初始化就...

2019-08-14 14:07:09 257

原创 【C++】——引用与指针的比较

引用从表层来看就是内存单元的别名。从底层来看,和指针处理相同,也开辟内存,在用到引用变量的地方系统会自动解引用。一般初学者很容易把引用和指针混淆一起,但他们并不一样。int m; //m是被引用物int &n=m; //n是m的一个引用n 相当于 m 的别名(绰号),对 n 的任何操作就是对 m 的操作。例如有人名叫王小 毛,他的绰号是“三毛”。说“三毛”怎么怎么...

2019-08-14 11:52:00 214

原创 【C++】——内联函数

内联函数:在C++中,以inline修饰的函数叫做内联函数,编译时C++编译器会调用内联函数的地方展开,没有函数压栈开销,内联函数提升程序运行的效率。基本思想:将每个函数调用以它的代码体来替换。内联函数在 C++ 中的地位是用来替换 C 中的宏代码块内联函数的注意事项:(1)内联函数是以空间换时间的做法,省去调用函数的额外开销。所以代码很长或者有循环/递归的函数不适宜使用内联。...

2019-08-09 16:12:10 317

原创 【Linux】——文件操作函数

文件操作函数头文件有以下几个:# include<sys/types.h># include<sys/stat.h># include<fcntl.h>(1)int open(const char *filename,int flag,int mode); //打开文件返回值:<0,表示出错了;>=0,表示文件描述符(fd),在r...

2019-08-03 20:48:08 209

原创 进程和线程的区别

线程:线程是进程内部的一条执行序列(执行流),一组有序指令的集合。进程:运行中的程序,即一组有序指令+数据+资源的集合。区别:(1)线程是系统调度执行的基本单位,进程是资源分配的基本单位。(2)线程依赖于进程,线程在进程内部,一个进程至少包含一条线程。(3)进程都是相互独立的,同一个进程中的线程除了进程的栈区,其他资源都共享。(4)系统在运行的时候会为每个进程分配不同的内存...

2019-07-31 19:50:18 704

原创 gdb调试工具的使用

gdb是我们在Linux下编程的一个重要调试工具,以下是我整理出来的用法。编译:gcc -o main main.c -ggdb debug版本的可执行文件名:启动调试(例如:gdb main)(1)单进程、单线程基础调试命令l:显示main函数所在的文件的源代码list filename:num:显示filename文件num行上下的源代码b linenum:给指定行添加...

2019-07-31 19:47:09 471

原创 Linux下编程——主函数传参

主函数的原型为:int main(int argc,char *argv[],char *envp);argc:传递的参数列表中参数的个数argv:传递的参数列表envp:传递的环境变量我们在Linux中编写一个主函数,看一下运行结果:# include<stdio.h># include<string.h># include<stdli...

2019-07-31 18:30:15 2361

原创 操作系统——进程管理

计算机的组成:CPU、内存、I/O我们将源文件(main.c)编译连接之后生成可执行文件(main(ELF)),然后将它执行,这就成了一个进程,之后加载到内存上。CPU是计算器和控制器,它按照顺序执行进程中的指令。程序:存储在磁盘上的可执行文件。进程:运行中的程序,其实也就是把程序从磁盘上加载到内存上。在这里我举一个实例来说明一下进程和程序的区别:程序:乐谱;进程:演奏的过...

2019-07-31 14:56:27 247

原创 快速排序

快速排序是对冒泡排序的一种改进,基本思想是:找一个数作为基准,经过一趟排序,将整个序列分成两部分,将比基准数小的数放在它左边,比它大的数放在它右边。如下例:对这个数组arr进行快速排序,首先我将选取0号下标的数6位基准数,放在临时变量tmp中存储,然后从right下标的数开始比较,如果arr[right]的值大于tmp的值,就一直做right--操作,直到遇到小于tmp的数,然后将此时ar...

2019-07-29 13:22:50 391 3

原创 struct和class的区别

C++中:(1)struct和class关键字都可以定义类,但是struct默认的访问限定是public,class默认的访问限定是private。(2)struct默认是公有继承(public),class默认是私有继承(private)。(3)当struct和class都定义了构造函数,就不能使用大括号对其进行初始化。(4)若没有定义构造函数,struct可以使用{}进行初始化...

2019-07-28 15:02:41 1420

原创 I/O复用

I/O复用使得程序能同时监听多个文件描述符,通常,网络程序在下列情况下需要使用I/O复用技术:(1)客户端程序要同时处理多个socket。(2)客户端程序要同时处理用户输入和网络连接。(3)TCP服务器要同时处理监听socket和连接socket。这是I/O复用使用最多的场合。(4)服务器要同时处理TCP请求和 UDP请求。(5)服务器要同时监听多个端口,或者处理多种服务。...

2019-07-27 19:12:21 234

原创 TCP和UDP的区别

1、TCP是面向连接的,TCP在传递数据之前,会有三次握手来建立连接,四次挥手断开连接;UDP是无连接的,即发送数据之前不需要建立连接。2、TCP是可靠的。在数据传递时,通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输,在数据传完后,还会断开连接用来节约系统资源。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;而UDP是不可靠的,不稳定。因为UDP没有TC...

2019-07-25 14:59:50 269

原创 TCP/IP协议族

TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层。每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务,体系结构图及主要协议如下图所示:数据链路层:数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(比如以太网、令牌环等)上的传输。不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的...

2019-07-24 15:46:04 203

原创 虚拟地址空间

4G虚拟地址空间布局图:由于每个进程都不能直接访问内核空间,而是通过系统调用间接进入内核,因此,所有的进程都共享内核空间。而每个进程都拥有各自的用户空间,各个进程之间不能相互访问彼此的用户空间。因此,对每一个具体的进程而言,都拥有4GB的虚拟地址空间。一个程序在经过编译、连接之后形成的地址空间是一个虚拟的地址空间,只有当程序运行的时候才会分配具体的物理空间。由此我们可以得知,程序的虚拟地址...

2019-07-21 17:24:01 221

原创 编译链接运行原理

首先,整个过程大致如下图:预编译阶段做的事:1、删除#define并做文本替换。2、处理所有的条件预编译指令,比如“# if","# ifdef",”# elif",“# else”,“# endif”。3、处理“# include"预编译指令,将被包含的文件插入到该预编译指令的位置,递归展开头文件。4、删除所有的注释,如:"//","/**/"。5、添加行号和列号...

2019-07-21 14:31:55 281

原创 new和malloc的区别

1、new分配的内存空间所在位置是自由存储区,而malloc在堆上动态分配内存。自由存储区不仅可以是堆,还可以是静态存储区,这都要看opeater new在哪里为对象分配内存。new是一个关键字,而malloc是一个函数,void *malloc(size_t size)。2、new申请内存分配时无须指定内存块的大小,按照数据类型进行分配,malloc分配内存按照指定的大小分配。3、new...

2019-07-19 20:15:32 7608

原创 实现对顺序表的增、删、改、查等操作

顺序表在计算机内存中以数组的形式保存的线性表,线性表分为顺序存储和链式存储。顺序存储:逻辑上是连续的,在内存上也是连续的。链式存储:逻辑上连续,内存上不一定连续。顺序表又分为定长顺序表(不可扩容的),和不定长顺序表(可扩容,用realloc动态开辟数组)。以下为定长顺序表的基本操作:(1)定义顺序表# define ELEM_SIZE 5typedef int ELEM...

2019-03-01 17:26:00 1017 1

原创 内存重叠问题

关于内存重叠问题,以一个题为例:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。我们通常会遇到以下四种情况:(1)如下图,将10个数中后3个数变为最前面3个数,前面各数顺序向后移动3个位置。由图可以看出,我们在移动时,先将后面3个数存到一个临时数组中,然后将剩下的数必须先从7开始依次向后移动3个位置,因为存在内存重叠问题,下图中蓝色部分为内存重叠部分,剩下的数都移动完之后,再...

2018-05-12 22:48:28 587

原创 一维数组与二维数组

(1)二维数组在c语言中遵循行优先的规则,一般表现形式有以下几种例如:int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int brr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int crr[][4]={1,2,3,4,5,6,7,8,9,10,11,12};int drr[3][]={1,2,3,4,5,6,7,8,9...

2018-04-17 23:27:08 459

原创 论字符串常量和字符数组

我们在使用数组时经常会遇到程序崩溃,字符串崩溃原因:1、试图修改字符串常量的值2、越界。通过下列程序来分析错误的原因:(1):int main(){    char *str1 = "abcde";  //在这里str1为字符串常量,不能修改,是指针,4个字节    char str2[] = "abcde";  //str2为字符数组,有'\0',所以也是字符串,6个字节// str1[0] =...

2018-04-11 23:30:25 236

原创 假设一个等式在n进制下成立,求n

这个问题我用一个例题来说明:例:假设在n进制下,下面的等式成立,567*456=150216,n的值是(D)A. 9     B. 10    C.12    D.18解答过程:(1)现在假设这个等式是在n进制下成立,那么我们就可以把它表示成(5*n^2+6*n+7)*(4*n^2+5*n+6)=150216。把这个表达式展开并且合并同类项,整理就得到,表达式1:20*n^4+49*n^3+88*...

2018-04-09 23:35:07 373

原创 指针的算术运算

(1)指针+-数字指针+1:意为加一个单元格指针加减数字,需要调整,调整的权重为sizeof(指针去掉一个*)int main(){ int *p1 = (int *)2000; printf("%d\n",p1+4);   //2016 int arr[10] = {1,2,3}; int *p = arr;        //int *p = 10; p++;         //加一个int...

2018-04-07 15:19:26 195

原创 关于指针

(1)定义对一个内存单元来说,指针就是内存单元的地址,举例来说,我们在银行存取款时,银行工作人员根据账号查找存单,找到之后在存单上填入存款、取款的金额。在这里,存单内似于存储单元,账号就是存单的地址,存款数即是存单的内容。在c语言中,每种数据类型的数据(变量或数组元素)都占用一段连续的内存单元。该数据的地址或指针就是指该数据对应存储单元的首地址。(2)指针的大小x86或者32位平台,指针4字节x6...

2018-04-07 14:31:31 201

原创 c 语言,关于数组

(1)赋值,定义//聚合类型:数组,结构体//聚合类型如果只初始化一部分,那么剩余部分则为0,下面有实例//初始化含义:在定义时直接赋值# include&lt;stdio.h&gt;int main(){    int a = 10;    int b = 10;    int arr[10];    //这个数组长度为10,定义此数组为整型    arr[3]=10;    //在arr这个数...

2018-04-07 10:47:45 457

原创 统计一个数的位数,并实现一个数的正序、逆序输出

2018-03-30 23:01:42 493

空空如也

空空如也

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

TA关注的人

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