自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Chenxi13

韬光养晦,厚积薄发。

  • 博客(38)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 剑指Offer:替换空格

题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输入“We%20are%20happy.”。由于空格是一个字符,而%20是三个字符‘%’‘2’‘0’。要完成这个替换,首先必须要保证原字符串的长度够长,否则就会造成内容覆盖的问题。接下来我们的思路就是遍历,然后遇到空格进行替换。但是我们想想,每次替换都会面临着一个移动的过程。将空格后...

2018-04-29 14:30:39 87

原创 剑指Offer:二维数组中的查找

在一个二维数组中,每一行都按照从左到右依次递增的顺序排序,每一列都按照从上到下依次递增的顺序排序。完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 我们发现在这个二维数组中,右下角的15是整个数组中最大的值,而左上角1是最小的值。并且从左往右以及从上至下都是依次递增。要在里面找到某一个元素是否存在,必须找到某些规律才可。所以这里我们利用两个特殊点来找。 首...

2018-04-29 12:35:30 442 3

原创 剑指Offer:不修改数组找出重复的数字

在一个长度为n+1的数组里,所有的数字都在1~n的范围内,所以数组中至少有一个数字是重复的(因为长度为n+1,而1~n只有n个数字,也就是说就算每个数字不一样,都会空余一个位置,所以至少有一个重复的数字)请找出数组中任意一个重复的数字,但是不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应输出的数字应该是2或者3。思路一:我们可以利用上篇博客的...

2018-04-29 11:05:24 183

原创 剑指Offer:找出数组中重复的数字

题目: 在一个长度为n的数组里的所有数字都在 0 ~ (n-1)的范围内。数组中 某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为 7 的数组{2,3,1,0,2,5,3},那么对应输出重复 的数字为 2 或者 3 。思路一:看到这道题,我的思路是先将这个数组进行排序。排序完毕后,遍历数组,如果出现两个相邻的数...

2018-04-28 18:43:59 291

原创 操作系统:浅析深度拷贝与浅拷贝

浅拷贝浅拷贝的实质相当于创建一个指针变量,然后让指针变量指向要拷贝的内容,相当于增加了一个映射关系,而并不是真正意义上的拷贝。如下图: 浅拷贝的优点在于拷贝的效率非常快,但是如果一旦改变内容,那么目标跟源都会被改变。这就会造成安全的问题产生。所以在某些时候不适用。深度拷贝深度拷贝就是在物理内存开辟空间,然后将源目标的数据拷贝至新的空间,最后利用指针指向这个新的空间。这样两个空间是...

2018-04-28 17:14:55 374

原创 数据结构之二叉树的基本操作(深度拷贝、求与二叉树有关值、查找)

上篇博客,写到了对二叉树进行销毁的地方,这篇博客主要是二叉树的深度拷贝和查找、求出二叉树的相关内容。求二叉树相关内容//求二叉树节点个数size_t _TreeSize(TreeNode* root, size_t* count){ if(count == NULL) { return -1; } if(root == NULL) {...

2018-04-28 16:34:43 591

原创 数据结构之二叉树的基本操作(遍历、创建、销毁)

生活中我们常常能够看到树。树枝会有很多分叉,这些分叉会再次分叉等。而我们的二叉树形似这一棵棵树,不过它的每个树杈都是两个。如下图。 今天我们就是实现一下二叉树的基本操作。 在实现之前,我们要理解二叉树的所有操作的核心都是 递归!!! 所以在实现的时候,首先就要想到的思想就是递归思想。二叉树的遍历方式二叉树的遍历方式有四种(基于上图):先序遍历:a b d e c f...

2018-04-28 15:44:02 1618

原创 Linux:守护进程

我们上篇博客在会话中,提到了话首进程bash。我们再来看看这个话首进程。 我们在查看bash进程的时候,发现在PPID这一栏,话首进程也是有父进程的。它的父进程的ID是27357,这就奇怪了,按道理来说打开终端,bash最先运行。难道打开终端前还有比bash更先的进程已经运行了?我们再来看看这个27357到底是什么? 我们发现在bash前还是有别的进程的。而这些进程是什么时候运行的呢?...

2018-04-28 13:46:41 111

原创 Linux:进程组/作业/会话

进程组我们在利用指令查看进程信息的表头 其中PPID与PID是父进程ID与子进程ID,而这里有个PGID是什么呢? 我们在谈论线程的时候,说过线程有一个线程组,而线程组ID就是这个线程主线程的ID。也是这个线程所组成进程的进程PID。而进程也是有进程组的,这里的这个PGID就是进程组ID,每个进程组有唯一的一个进程组ID。并且这个ID就是进程组组长ID,也就是创建进程组的进程。类似于线程里...

2018-04-26 13:03:57 322

原创 Linux:浅析死锁问题

在浅析线程的同步互斥的博客中提到死锁问题。 那么什么是死锁呢?死锁的概念在某一个程序当中,由于一些原因,导致某一个进程或者线程无限期的占有一种或多种公共资源不归还。导致其他进程或者是线程将永远获取不到这些公共资源,而进程或线程选择进行挂起等待公共资源,进而导致这些线程或进程的饥饿问题。这就是死锁问题。形成死锁的四个必要条件互斥使用资源占有和等待资源不可抢夺资源循环等待资源...

2018-04-23 12:13:23 442

原创 Linux:gdb调试多线程

我们这里仍旧将gdb的基本操作在这里罗列一下:•list(l)行号:显示源代码。一次显示10行 •list(l)函数名:列出某个函数的源代码 •r或run:运行程序 •s或step:进入函数调用 •breaktrace(bt):查看函数调用栈 •info(i) locals:查看当前栈帧局部变量的值 •info break :查看断点信息 •finish:执行到当前函数返回,然后...

2018-04-22 17:18:34 444

原创 Linux:gdb调试多进程

gdb是Linux下的一款调试工具。我们的进程需要调试的话,那么在编译的时候需要加上-g选项,这个选项是增加调试信息。如果不加,则无法调试。如果有core文件的话,可以用core文件与进程一起调试。下面我们先来介绍一下gdb下的基本指令list(l)行号:显示源代码。一次显示10行list(l)函数名:列出某个函数的源代码r或run:运行程序s或step:进入函数调用breakt...

2018-04-21 21:18:52 432

原创 Linux:浅析线程(POSIX信号量与读写锁)

说到信号量,我们立即反应上来,System V版本当中的信号量。信号量的本质相当于一个计数器,是描述保护临界资源中资源的数目。其目的是保护临界资源。但是System V版本的信号量是应用于进程间的。而POSIX信号量是可以用于线程间的。POSIX信号量函数#include <semaphore.h>int sem_init(sem_t* sem, int pshared...

2018-04-20 11:49:09 362

原创 Linux:浅析线程(线程的同步与互斥)

线程的同步与互斥互斥量(mutex)在这里,我们先看一个代码。#include <stdio.h>#include <pthread.h>#include <unistd.h>int ticket = 100;void* BuyTicket(void* arg){ char* msg = (char*)arg; whil...

2018-04-20 09:42:09 199

原创 Linux:浅析线程(线程控制)

我们知道一个程序运行时,加载到内存成了进程。假如一个进程需要做一大堆事情,这个事情多的嘛就不谈了。那么进程可不可以有一些小弟?这些小弟可以替代进程做一些事情,这样可以提高进程的工作效率。那么这个时候线程就出来了。进程在创建的时候需要创建资源、创建PCB。那么进程如果作为大哥的话,它也应该给它的小弟分配东西,只有这样小弟才能有东西去干活。 所以进程也就是承担分配资源的实体。而线程就是进程给线程...

2018-04-19 19:34:38 264

原创 数据结构之迷宫求解问题(二)

在上篇文章中,我们重点解决迷宫寻找路径。这篇文章,我们研究的是对迷宫最短路径进行寻找。 如果一个迷宫有很多条路径,那我们该如何找到这条最短的路径呢? 我们上篇文章以及讲过,每次判断一个点是否能够落脚后,入栈,然后进一系列操作。这里我们的思路是,开始创建两个栈,一个存放每次出去的路径的过程,一次存放最短的路径,最后打出最短的路径。这里需要让栈内元素为我们的结构体Point。在每个出口比较我们...

2018-04-19 09:45:24 646

原创 数据结构之迷宫求解问题(一)

我们小时候都玩过迷宫,走迷宫可以说是非常有意思了。而在我们大脑里是如何对这个游戏进行思考的呢?其实我们在玩这个游戏的是,大多是一条路走到黑,如果到达出口那么就走出来了,如果是死胡同,那么回到刚才的分叉口,再找一条路再一条路走到黑,以此类推。而我们在实现迷宫求解的时候也是利用这种方法,这种方法又称作回溯法。我们要实现迷宫求解问题,首先应当是创建一个迷宫。这里我们用一个二维数组当做一个平面,然...

2018-04-19 08:50:52 36031 3

原创 Linux:可重入函数与不可重入函数

函数是一段载入到内存的代码。函数的代码可长可短,执行时间长度也不确定。在多线程中,线程之间是可以进行切换的。函数是一段写好的代码,属于程序公有的代码段。一个进程中有多个线程,每一个线程都可以调用这段函数代码执行。而在多线程环境中,线程的切换是无法预料的,你不知道下一秒是哪个线程在执行,每时每刻的运行环境都不一样,因为线程切换也是变化莫测的。这是操作系统调度进程线程的范围,不是我们能够掌控的。既然我...

2018-04-16 16:01:19 1694

原创 数据结构之栈与队列面试题:共享栈(利用一个数组实现两个栈)

利用数组来实现栈,这个我们已经实现了。今天我们利用一个数组,来实现两个栈的操作。首先我们得考虑,一个数组怎么才能当做两个栈,这里我有两个思路。在数组的两头开始相向而插。在数组奇偶下标分别插入考虑到我们两个栈的可延展性,我最终决定利用第二种方式来插入。具体思路如下:首先我们要创建新的结构体来控制我们这个数组及其栈。#pragma once#include <stdio...

2018-04-12 16:41:21 491

原创 数据结构之栈与队列的面试题:判断字符串是否按照出栈顺序

可能这个题目猛一看,并不知道题目要求是什么,让我们做什么。首先我们来说说这个题目大意。 给定一个字符串,如:a b d e c 一个栈的入栈顺序为:a b c d e 那么出栈顺序显而易见:e d c b a 题目意思为:字符串 a b d e c 是否能按出栈顺序所打出。比如说,我们先入栈a元素,接着再将a元素出栈,则得到a元素,接着再入b元素,同理出栈,再入c元素,发现与字符串d元素并...

2018-04-12 16:22:45 908

原创 数据结构之栈与队列的面试题:用两个队列实现一个栈

首先要用队列实现栈,我们主要的问题是,应该让先入队列的元素后出去,这样就是栈的操作了,那该如何操作呢? 我们这里的思路是,首先两个队列,起初在入栈的时候插入到任意一个空队列当中即可,接下来,如果入栈应该插入到一个有元素的队列当中去。在出栈的时候,应该把有元素的队列内的前n-1个元素全部入到另一个空队列内部,接着把剩下的最后一个元素出栈即可。 //实现如下#include <stdi...

2018-04-12 16:11:46 579 2

原创 数据结构之栈与队列的面试题:用两个栈实现一个队列

栈的原则是先进的后出,而队列是先进先出,那么如何利用两个栈来实现一个队列呢? 我们的思路是利用两个栈,一个栈作为桥梁,而另外一个作为我们的“队列”。实际上,我们首先对桥梁栈进行入栈,入栈完毕后,再依次去桥梁栈内元素,入栈到我们的“队列”当中去,此时我们的桥梁栈的栈顶就变成了我们“队列”里的队尾,而桥梁栈的栈底,则变成了“队列”里的队首。 //实现#include <stdio.h...

2018-04-12 16:00:04 194

原创 数据结构之栈的面试题:最小栈的实现

在前面几个博客,利用顺序表去链表的方式分别实现了队列与栈的基本操作。这篇博客,我们对常见的一些栈、队列的面试题进行总结。最小栈的实现什么是最小栈,最小栈的意思就是在不破坏栈的入栈出栈顺序的前提下,在栈顶永远保存着栈内元素的最小值。我们的思路是每次在入栈元素时入栈两个,第一个入应该入的元素,第二个入栈内最小元素。//实现#include <stdio.h>#i...

2018-04-12 15:49:13 366

原创 Linux:浅析信号(二)

上篇博客的最后我们说到了进程在接收到信号,信号处于未决的状态是,不是立刻就递达,去处理这个信号的,而是在合适的时候去处理,那这个合适的时候在什么时候呢?由上图可以知道,其实我们前面所说的合适的时候就是在在内核中处理完某些异常或执行完某些系统调用之后,在即将返回用户模式之前,这个时间点去处理能够递达的信号,如果是默认处理,那么则终止该进程,如果是忽略此信号,那么不管它,如果是自定义动作,...

2018-04-09 17:23:12 188

原创 Linux:浅析信号(一)

信号,这个元素在我们的生活中可是非常常见的,比如说是红绿灯,比如说是手机铃声。所谓信号就是在人或事情感受到这个元素产生以后会做出相应的处理动作,这就是信号。而在我们Linux下,什么是信号呢?我们知道进程结束情况有三个,也在前面关于进程的博客中说了,分别就是诸葛亮、司马懿、周瑜。先不谈诸葛亮与司马懿的情况,就说说周瑜这个情况。 进程出现周瑜这个情况无例外肯定都是进程崩了,然后挂掉了,进程结束...

2018-04-09 14:45:16 362

原创 数据结构之链式队列的实现

上篇我们提到了队列的基本概念与操作,这篇我们利用链表的方式来实现队列。 要用到链表,我们发现无论是头插头删还是尾插尾删都会涉及到遍历链表,所以这是不可避免的。再者,再对链表进行头部尾部处理的时候,我们应该引入一个新的指针,一个指针指向链表的头部,另一个指向尾部,这样我们就可以轻松的进行入队与出队。实现//linkqueue.h#pragma once#include &l...

2018-04-07 19:58:28 248

原创 数据结构之顺序队列的实现

顺序队列,即利用顺序表来是实现队列的基本操作。什么是队列?一堆人在排队的时候,肯定是队首的人先得到服务。而队尾的人则最后得到服务,同时要想进入队列只能从队尾进行进入,不能插队。所以在用顺序表来实现的时候,需要定义队列的头与队列的尾部,这样就能够更好的对尾部进行插入,头部进行取出。实现//seqqueue.h#pragma once#include <stdio.h>...

2018-04-07 12:30:34 499

原创 数据结构之链式栈的实现

上篇博客我们已经对栈的基本操作有了介绍,现在我们利用链表的方式来实现一下栈的基本操作。 其实利用链表更好实现栈,因为我们链表的头插与头删恰好可以与栈相对应,先进的后出,这里我们就不过多的赘述,直接进行实现即可。//linkstack.h#pragma once#include <stdio.h>#include <stddef.h>#include &lt...

2018-04-07 12:14:16 384

原创 数据结构之顺序栈的实现

今天我们来对顺序栈进行实现,首先我们要明白什么是栈,栈如同一个杯子,先进去的水必定最后倒出来。今天我们用顺序表的方式来对栈进行实现。首先顺序表是由数组进行实现的,而我们要实现栈,那么就需要知道栈的基本操作有哪些。栈的基本操作入栈、出栈、取栈顶首元素、初始化栈、销毁栈实现#pragma once#include <stdio.h>#include <std...

2018-04-07 12:08:29 393 1

原创 Linux:进程间通信(信号量)

信号量是什么?在开始知道信号量的这个名词的时候,根本不能从字面上来理解信号量到底是什么?它跟信号有什么关系呢? 其实信号量的实质就是计数器!!! 为什么是计数器呢?接着往下看。信号量原理我们知道,进程在通信的时候会对临界资源进行访问操作等,但这样说来但凡能够访问到这块临界资源的进程都可以对其进行操作。那么会不会出现一种问题,就是当进程A刚刚在临界资源内存放一个数据以备后面使用,...

2018-04-06 22:18:33 265

原创 Linux:进程间通信(共享内存)

共享内存原理共享内存也是我们进程间通信内容当中的一个重点。什么是共享内存呢? 我们在学习虚拟地址空间的时候,在堆与栈之间有一片区域叫做共享区,而共享内存就是在物理内存内,将一片内存通过页表映射的方式映射至虚拟地址空间的共享区内,而不同进程都可以在其自己的虚拟地址空间上面的共享区通过映射访问到这片共享内存,这个时候不同进程相当于看到了同一片公共资源即共享内存,那么他们就可以在这片内存上进行通信...

2018-04-06 16:27:37 520

原创 Linux:进程间通信(消息队列)

消息队列简介前两篇博客我们讲述了利用匿名管道与命名管道来实现进程间通信的方法。这里我们再对消息队列进行讲述。消息队列,通俗来讲就是一堆消息组合在一起的队列,也就是一个个数据块,并且这些数据块是有类型的,而我们不同进程通过一个消息队里的标记,查询到同一个消息队列,此时的消息队列就相当于一片公共资源(临界资源),这时候通过这个消息队列就可以达到我们进程间的通信。但是消息队列中每个消息的最大长度都是...

2018-04-05 16:58:48 240

原创 Linux:进程间通信(命名管道)

命名管道上一篇我们说到进程间通信的时候,对匿名管道进行了操作使用,这里我们队命名管道进行操作使用。在我们使用匿名管道的时候,是在fork之后,利用父子进程的关系,在代码中用if语句分流,然后让父子进程分别对匿名管道进行写入读取的操作,达到了父子进程间通信交流的目的。而如果是两个进程之间呢?并非父子进程,它们如何去通信? 这时候就要使用我们的命名管道了。在Linux操作系统下,一切皆文件。而且...

2018-04-04 17:08:26 290

原创 Linux:进程间通信(匿名管道)

进程间通信我们知道,进程之间是相互独立的,每个进程拥有自己虚拟地址空间,并且虚拟地址空间根据页表的映射,映射到属于自己的物理内存上。并且各个进程之间互相不影响,执行自己的代码。这样说来进程之间难道没有可能交流联系?显然是不可能的。 一般来说只要让我们互不相干的进程看到同一块公共资源,那么它们就可以在这片公共资源上面交流联系。与我们人一样,每个人都是一个独立的个体,但是到了一个公共场所,人与人...

2018-04-03 15:48:53 186

原创 数据结构之双向带头节点带环链表的实现

之前我们曾实现过单向不带头结点不带环的单链表,但是发现,在运用中并不是那么的好用,因为单向链表每个元素只能找到他后面的元素,而无法对其前面进行查找,这样在实际的使用中并不好用,而双向带头结点带环链表却是非常好用,因为他有两个指针,一个可以查找到后面的元素,同样另一个也可以查到前面的元素。其实所谓双向链表,即两个指针next与prev一个指针可以向后进行遍历,一个指针可以向前,而头结点就相当...

2018-04-03 13:51:14 197

原创 数据结构之单链表常见面试题(二)

判断两个链表是否相交,若相交返回其交点位置(两链表都不带环)解析:两个不带环的链表要能相交只能是Y字型相交,如下图。 所以判断相交只需要分别让两个链表都走到结束时,判断他们的data值是否相等。//实现LinkNode* HasCross(LinkNode* head1, LinkNode* head2)//判断两个链表是否相交{ if(head1 == NULL)...

2018-04-02 14:25:09 213

原创 Linux:静态库和动态库

我们指定C程序从代码到一个可执行程序需要经过预处理、编译、汇编、链接。而最后一步链接又分为动态链接与静态链接。静态链接相当于就是讲所要链接的库提前放入链接的文件,这样子的文件体积较大,但是可移植性较高。而动态链接是在运行的时候才去主动链接所需要链接的库,这样的代码体积较小,多个程序共同使用库的代码。我们LInux运用的是动态链接。为了方便我们在接下来的内容中测试静态库与动态库,我们编写一个...

2018-04-01 17:13:23 174

原创 Linux:浅析文件系统

inode当我们在终端下输入命令ls -l 我们发现这里显示的信息从左到右依次是文件类型、权限、硬链接数、文件拥有者、文件拥有者组、大小、最后修改时间以及文件名。当我们使用指令 stat linklist查看具体文件的信息时:会发现在这里面有了更详细的一些信息,其中在时间那一栏我们发现有三个时间:Access、Modify、Change,那这三个时间分别代表什么含义呢?...

2018-04-01 15:57:24 136

es xpack 配置详情

es xpack 配置详情 7.10.1,通过安装 es kibana,使用自带的 x pack 插件来完成权限控制,网上很多都不全,本文非常详细。es kibana 版本号为 7.10.1 与 7.10.0,并且附带相关的步骤,以及方案。

2020-12-15

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

TA关注的人

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