- 博客(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 3891 1
原创 为rm命令添加一个垃圾回收站
背景用rm删除文件的同时会删除inode信息,这使得使用rm删除的文件很难恢复。特别是带有-rf参数时,一定要慎之又慎。 我希望用rm删除的文件(夹)可以在回收站找到。本文就教你实现这个功能。 方法: 1. 在/home/username/ 目录下新建一个目录,命名为:.trash 2.新建一个shell文件,命名为: saferm.sh,内容如下:#!/bin/bash###...
2018-06-16 13:18:11 657 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 2372 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 5637 1
原创 day25之布隆过滤器的实现和优缺点以及扩展
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。代码实现://bitMap.h布隆过滤器存在是准确的还是不存在是准确的? 2:布隆过滤器优缺点? 3:如何扩展BloomFilter使得它支持删除元素的操作?请设
2017-08-08 13:50:02 582
原创 day26之模拟实现memcpy和memmove函数
【基础题】--模拟实现C库的memcpy和memmove。 2.【附加题】--给两个文件,分别有100亿个URL,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法。(设计出解决方案)
2017-08-08 12:17:53 331
原创 day24之位图的实现和位图的应用
定义位图法就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示。那么就可以开一个int数组,一个int有32个位,就可以表示32个人。操作的时候可以使用位操作。 位图实现unsigned int bit[N];在这个数组里面
2017-08-06 00:15:59 309
原创 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 273
原创 排序算法三归并排序
归并排序(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 944
原创 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 547
原创 day19之找出最喜欢吃的前k种水果(数组中次数出现最多的前k个数)
本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。 分析:一看这题就是典型的求数组中出现次数最多的前k个数, 首先我们应该用哈希表或map先统计元素
2017-08-02 02:00:14 475
原创 排序算法二冒泡排序和快排
冒泡排序想必大家都非常熟悉了,这里就直接贴代码了void BubbleSort(int 快排的三种写法四种优化 快排的非递归 尾部递归
2017-08-02 01:49:36 376
原创 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 387
原创 排序一之插入排序和希尔排序
1.插入排序 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 算法描述: 1.从第一个元素开始,该元素
2017-07-31 12:53:33 251
原创 day17之将二叉搜索树转换成一个排序的双向链表
题目: 输入一棵二叉搜索树,将该二叉搜索树转换为一个排序的双向链表。要求不能创建任何新的节点,只能调整树中指针的指向。 分析与解法: 1、由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点。当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可。进而更新当前链表的最后一个结点指针。
2017-07-30 01:53:02 336
原创 C语言模拟实现C++继承和多态
-C语言模式实现C++继承和多态C++中的多态我们知道的是在C++中会维护一张虚函数表,根据赋值兼容规则,我们知道父类的指针或者引用是可以指向子类对象的。如果一个父类的指针或者引用指向父类的对象,会调用父类的函数,如果该父类对象的指针或者引用指向的是子类的对象,而且该子类已经重写了父类的虚函数,则该指针会调用子类的已经重写的虚函数。//c++中的多态class A{
2017-07-28 23:52:36 334
原创 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 224
原创 day15之求二叉树中两个节点的最近公共祖先
求二叉树两个节点的最近公共祖先:1:二叉树每个节点有parent(三叉链) 2:二叉树是搜索二叉树。 3:就是普通二叉树。(尽可能实现时间复杂度为O(N))
2017-07-27 18:19:11 508
原创 day15之判断一棵树是不是完全二叉树
1.完全二叉树的定义? 判断一棵树是否是完全二叉树,首先要知道什仫是完全二叉树?完全二叉树就是除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。 2、如何判断一棵树是完全二叉树? 两种判断完全二叉树的方法: 1)标记法: 设置标记flag=false,如上图所示,从根结点开始层序遍历入队列,如果队列不为空,一直循环。遇到第一个没有左孩子或者右孩子的结点,设
2017-07-27 18:04:39 716 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 1334
原创 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 299
原创 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 756
原创 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 266
原创 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 326
原创 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 297
原创 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 270
原创 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 238
原创 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 246
原创 C语言函数调用过程--栈帧
什么是栈帧? 每一次函数调用都为这次函数调用开辟一块空间,这个空间就叫做栈帧。 首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),我们称为栈底指针,寄存器esp指向当前的栈帧的顶部(低地址),我们称为栈顶指针。 注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的
2017-07-18 13:39:49 1483
原创 day05删除一个无头单链表的非尾节点 +从尾到头打印单链表+复杂链表的复制
1.删除一个无头单链表的非尾节点,时间复杂度为O(1)2.从尾到头打印单链表 【附加题】--复杂链表的复制。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。
2017-07-17 23:39:46 294
原创 day04之链表不带环相交+带环相交问题+fork函数输出几个短线
判断两个链表是否相交,若相交,求交点。(假设链表不带环)--1.判断两个链表是否相交,若相交,求交点。(假设链表不带环)2.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】 2.【附加题】--请问下面的程序一共输出多少个“-”?
2017-07-17 00:50:17 278
原创 day03之判断链表带环以及求环的长度及环的入口点+一个类不能被继承及只能分别在栈堆上创建对象
判断链表是否带环?若带环求环的长度?若带环求环的入口点?struct ListNode{ int val; ListNode *next; ListNode(int x):val(x),next(NULL) { }};.设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象。
2017-07-16 10:04:05 318
原创 day01之合并两个有序链表+实现1+2+3...+n要求不能使用乘除法循环条件判断等
合并两个有序链表,合并以后的链表依旧有序。递归写法和非递归写法实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。(这个题有多种解法,大家可以尽量去思考,这个题最优的解法时间复杂度是O(1) 构造函数写法,虚函数写法,逻辑或短路规则
2017-07-15 11:01:47 280
原创 day02逆置/反转单链表+查找单链表的倒数第k个节点+实现一个Add函数不用四则运算
-逆置/反转单链表查找单链表的倒数第k个节点,要求只能遍历一次链表 --实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--等等
2017-07-15 10:50:18 411
原创 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 468
原创 linux定时任务crontab命令和crond服务详解
linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。 一、crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows
2017-07-09 12:22:37 5324 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 778
原创 用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 4636 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 410
原创 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 698
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人