自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ubuntu16.04如何安装最新的nginx

Ubuntu 16.04安装Nginx在Ubuntu下安装Nginx有以下方法,本文介绍的是如何通过apt-get安装最新的nginx,此方法快速简洁,下面是安装nginx的步骤:在/etc/apt目录下下载nginx_signing.key wget http://nginx.org/keys/nginx_signing.key sudo apt-key add ngi...

2018-06-19 21:27:33 3921 1

原创 为rm命令添加一个垃圾回收站

背景用rm删除文件的同时会删除inode信息,这使得使用rm删除的文件很难恢复。特别是带有-rf参数时,一定要慎之又慎。 我希望用rm删除的文件(夹)可以在回收站找到。本文就教你实现这个功能。 方法:  1. 在/home/username/ 目录下新建一个目录,命名为:.trash        2.新建一个shell文件,命名为: saferm.sh,内容如下:#!/bin/bash###...

2018-06-16 13:18:11 667 2

转载 linux free命令详解: cache和buff的区别

Linux系统上,常用free命令查看内存的使用情况,本文主要为你介绍free命令的输出结果:解释一下linux上free命令的输出。  下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(Free Output)。例如:FO[2][1] = 24677460FO[3][2] = 10321516     

2017-08-13 17:05:39 2383 1

原创 智能指针shared_ptr引用计数工作原理

引用计数原理shared_ptr的实现是这样的:  shared_ptr模板类有一个__shared_count类型的成员_M_refcount来处理引用计数的问题。__shared_count也是一个模板类,它的内部有一个指向Sp_counted_base_impl类型的指针_M_pi。所有引用同一个对象的shared_ptr都共用一个_M_pi指针。指向相同资源的所有

2017-08-09 14:06:34 5744 1

原创 day25之布隆过滤器的实现和优缺点以及扩展

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。代码实现://bitMap.h布隆过滤器存在是准确的还是不存在是准确的? 2:布隆过滤器优缺点? 3:如何扩展BloomFilter使得它支持删除元素的操作?请设

2017-08-08 13:50:02 588

原创 day26之模拟实现memcpy和memmove函数

【基础题】--模拟实现C库的memcpy和memmove。 2.【附加题】--给两个文件,分别有100亿个URL,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法。(设计出解决方案)

2017-08-08 12:17:53 333

原创 day24之位图的实现和位图的应用

定义位图法就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示。那么就可以开一个int数组,一个int有32个位,就可以表示32个人。操作的时候可以使用位操作。 位图实现unsigned int bit[N];在这个数组里面

2017-08-06 00:15:59 312

原创 day23之数组循环右移k位+去除重复的字符。

将N个字符的数组,循环右移K位。时间复杂度O(N)。 #include<iostream>using namespace std;#include<cassert>#include<string.h>void Reverse(char *array, int left, int right){ while(left < right) { swap(array[

2017-08-05 23:35:32 277

原创 排序算法三归并排序

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。递归代码实现:void Merge(int array[], int *temp, int left, int mid, int r

2017-08-04 02:08:47 955

原创 day21桶排序一个无序数组+求一个无序数组中的中位数

int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N) void BucketSort(int array[], int size){ assert(array && size > 0); int max = array[0]; int min = array[0]; for(int i

2017-08-04 00:36:37 556

原创 day19之找出最喜欢吃的前k种水果(数组中次数出现最多的前k个数)

本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。 分析:一看这题就是典型的求数组中出现次数最多的前k个数, 首先我们应该用哈希表或map先统计元素

2017-08-02 02:00:14 480

原创 排序算法二冒泡排序和快排

冒泡排序想必大家都非常熟悉了,这里就直接贴代码了void BubbleSort(int 快排的三种写法四种优化 快排的非递归 尾部递归

2017-08-02 01:49:36 380

原创 day18之用shell脚本实现一个希尔排序

#!/bin/bashfunction ShellSort(){ echo "输入数组的长度" read size for((i=0; i<size; ++i)) do echo "输入第$((i+1))个元素" read array[i] done echo "${array[@]}" #array=(34 87

2017-07-31 13:01:27 397

原创 排序一之插入排序和希尔排序

1.插入排序 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 算法描述: 1.从第一个元素开始,该元素

2017-07-31 12:53:33 254

原创 day17之将二叉搜索树转换成一个排序的双向链表

题目: 输入一棵二叉搜索树,将该二叉搜索树转换为一个排序的双向链表。要求不能创建任何新的节点,只能调整树中指针的指向。 分析与解法: 1、由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点。当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可。进而更新当前链表的最后一个结点指针。

2017-07-30 01:53:02 338

原创 C语言模拟实现C++继承和多态

-C语言模式实现C++继承和多态C++中的多态我们知道的是在C++中会维护一张虚函数表,根据赋值兼容规则,我们知道父类的指针或者引用是可以指向子类对象的。如果一个父类的指针或者引用指向父类的对象,会调用父类的函数,如果该父类对象的指针或者引用指向的是子类的对象,而且该子类已经重写了父类的虚函数,则该指针会调用子类的已经重写的虚函数。//c++中的多态class A{

2017-07-28 23:52:36 339

原创 day16剑指offer---重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输出的前序遍历和中序遍历的结果都不含有重复的数字。前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5二叉树节点的定义如下:struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeN

2017-07-28 23:31:04 226

原创 day15之求二叉树中两个节点的最近公共祖先

求二叉树两个节点的最近公共祖先:1:二叉树每个节点有parent(三叉链) 2:二叉树是搜索二叉树。 3:就是普通二叉树。(尽可能实现时间复杂度为O(N))

2017-07-27 18:19:11 518

原创 day15之判断一棵树是不是完全二叉树

1.完全二叉树的定义? 判断一棵树是否是完全二叉树,首先要知道什仫是完全二叉树?完全二叉树就是除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。 2、如何判断一棵树是完全二叉树? 两种判断完全二叉树的方法: 1)标记法: 设置标记flag=false,如上图所示,从根结点开始层序遍历入队列,如果队列不为空,一直循环。遇到第一个没有左孩子或者右孩子的结点,设

2017-07-27 18:04:39 720 1

原创 day14之判断一个节点是否在一棵二叉树中+判断一颗二叉树是是否是另一颗树的子树

判断一个节点是否在一棵二叉树中struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};判断一棵树是不是另一颗树的子树。

2017-07-26 17:29:33 1337

原创 day13之二叉树的前中后序遍历非递归+两个链表求差集

实现二叉树的前序/中序/后序非递归遍历。已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。 链表结点的结构类型定义如下: struct node { int elem; node* next;

2017-07-26 15:23:12 303

原创 day12之判断一棵二叉树是否是平衡二叉树+求一颗二叉树的镜像+判断一个数在二维数组中是否存在

判断一棵二叉树是否是平衡二叉树struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};//方式一:求每个节点的左右子树的高度,判断是

2017-07-25 01:45:31 764

原创 day11之求二叉树的高度+销毁一颗二叉树+链表每K个节点之间逆序

求二叉树的高度链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现Node* RotateList(Node* list, size_t k). 提示:这个题是链表逆置的升级变型

2017-07-23 23:08:33 268

原创 day10之求二叉树叶子节点的个数+求二叉树第k层的节点个数+数组中超过一半的数字

求二叉树叶子节点的个数`struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };数组中超过一半的数字{ if(

2017-07-22 15:03:33 328

原创 day09之N的阶乘N!末尾有多少个0 + 二叉树的层序遍历

给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0 思路:看到这题我们直观的思路就是先求出N!,再判断N!末尾有多少个0,但是这有个问题,当N 很大的时候,会溢出,所以这种思路只能计算N很小的情况。int ZeroOfNum(int num){ assert(num > 0); int i = 1; long l

2017-07-21 11:08:57 301

原创 day08之元素出栈、入栈顺序的合法性+计算一个整数二进制位中1的个数

元素出栈、入栈顺序的合法性 如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。 bool IsPopOrder(vector<int> pushV,vector<int> popV) { if(pushV.size() != popV.size()) return

2017-07-20 23:51:57 274

原创 day07之包含min函数的栈+查找一个字符串中第一个只出现两次的字符

实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1) class Stack{ public: void Push(int val) { s.push(val); if(minstack.empty()) {

2017-07-19 13:22:28 241

原创 day06使用两个栈实现一个队列+使用两个队列实现一个栈+字符串空格替换

1.【基础题】--1.使用两个栈实现一个队列+使用两个队列实现一个栈 ps:两个题几乎是一样的思路,所以放一起了 2.【附加题】--替换字符串中的空格为$$$。要求时间复杂度为O(N) 例如:将"talk is cheap show me the code"替换。为"talk$$$is$$$cheap$$$show$$$me$$$the$$$code"。

2017-07-18 23:41:32 249

原创 C语言函数调用过程--栈帧

什么是栈帧? 每一次函数调用都为这次函数调用开辟一块空间,这个空间就叫做栈帧。 首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),我们称为栈底指针,寄存器esp指向当前的栈帧的顶部(低地址),我们称为栈顶指针。 注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的

2017-07-18 13:39:49 1493

原创 day05删除一个无头单链表的非尾节点 +从尾到头打印单链表+复杂链表的复制

1.删除一个无头单链表的非尾节点,时间复杂度为O(1)2.从尾到头打印单链表 【附加题】--复杂链表的复制。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。

2017-07-17 23:39:46 295

原创 day04之链表不带环相交+带环相交问题+fork函数输出几个短线

判断两个链表是否相交,若相交,求交点。(假设链表不带环)--1.判断两个链表是否相交,若相交,求交点。(假设链表不带环)2.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】 2.【附加题】--请问下面的程序一共输出多少个“-”?

2017-07-17 00:50:17 280

原创 day03之判断链表带环以及求环的长度及环的入口点+一个类不能被继承及只能分别在栈堆上创建对象

判断链表是否带环?若带环求环的长度?若带环求环的入口点?struct ListNode{ int val; ListNode *next; ListNode(int x):val(x),next(NULL) { }};.设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象。

2017-07-16 10:04:05 319

原创 day01之合并两个有序链表+实现1+2+3...+n要求不能使用乘除法循环条件判断等

合并两个有序链表,合并以后的链表依旧有序。递归写法和非递归写法实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。(这个题有多种解法,大家可以尽量去思考,这个题最优的解法时间复杂度是O(1) 构造函数写法,虚函数写法,逻辑或短路规则

2017-07-15 11:01:47 281

原创 day02逆置/反转单链表+查找单链表的倒数第k个节点+实现一个Add函数不用四则运算

-逆置/反转单链表查找单链表的倒数第k个节点,要求只能遍历一次链表 --实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--等等

2017-07-15 10:50:18 414

原创 vim/vi常用的快捷方式

一些像jkhl,dd,yy这种简单的快捷方式就不说了,说些稍微用点复杂的快键键:1.如何进行多行注释: 1.按ctrl+v进入visual block模式 2.选择要注释的行 3.大写的i进入插入模式 4.Esc退出。2.删除多行注释: 1.按ctrl+v进入visual block模式 2.选择要删除注释的行 3.按小写的d3.删除一行中某些

2017-07-09 17:23:46 472

原创 linux定时任务crontab命令和crond服务详解

linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。 一、crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows

2017-07-09 12:22:37 5375 1

原创 如何用shell脚本语言去截取字符串

shell中几种常用截取字符串的方法 一. 概念 在shell中通过截取字符串操作可以提取到我们所需要的特定字符串 假设变量str=http://blog.csdn.net/hj605635529/article/details/73556855二. 操作符 ① #表示 从左截取,删除左边字符,保留右边字符#!/bin/bashstr=http://blog.csdn.net/hj60

2017-07-09 00:22:39 785

原创 用shell脚本语言实现一个斐波那契数列的递归和非递归版本

代码:#!/bin/bash -x#第一种写法#first=1#second=1#last=1##if [ $1 -le 2 ];then# echo 1#fi##i=3#while [ $i -le $1 ]#do# let last=first+second# let first=second# let second=last# let i++#done

2017-07-08 00:57:23 4693 2

原创 用shell脚本实现一个彩色的进度条

演示:代码如下:#!/bin/bashindex=('|' '/' '-' '\\') #定义一个字符数组bar='#'i=0while [ $i -le 100 ]do let colour=30+i%8 echo -en "\e[1;"$colour"m" printf "[%-100s][%d][%c]\r" "$bar"

2017-07-07 15:26:58 417

原创 linux下静态库和动态库的创建和使用

一》静态库的创建和使用: 静态库的制作1>. 命名规则1). lib + 库的名字 + .a2). libmytest.a2>. 制作步骤:1). 生成对应的.o文件 -- .c --> .o          -c2). 将生成的.o文件打包  ar rcs + 静态库的名字(libMytest.a) + 生成的所有的.o3>. 发布和使用静态库:1). 发布

2017-07-05 13:58:59 701

空空如也

空空如也

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

TA关注的人

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