自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

丁香枝上,豆蔻梢头

提出问题,解决问题,是我前进的动力

  • 博客(100)
  • 问答 (2)
  • 收藏
  • 关注

原创 每日一题——atoi,itoa函数的实现

atoi是将字符串转换为长整形数的一种函数,itoa相反 atoi实现需注意一下点: 1,空格; 2,表示数值的正负号; 3,结束条件:非数字或‘\0’; 4,考虑溢出问题; 5,考虑异常输入问题(+abc …),用全局变量valid标识;#define INT_MAX ((int)0x7FFFFFFF)#define INT_MIN ((int)0x80000000)boo

2017-08-09 19:34:40 339

原创 每日一题——memcpy,strcpy,memmove的实现

memcpy与strcpy的区别: 1,用途不同:strcpy主要用来字符串拷贝,memcpy主要是其他类型的拷贝; 2,使用方式不同:strcpy是遇到‘\0’停止,memcpy是根据第三个参数来决定拷贝内容;memmove: 原型:void memmove( void dest, const void* src,size_t count ); 用途:从src的count个字符拷贝到des

2017-08-09 16:48:40 330

原创 每日一题——布隆过滤器

布隆过滤器:它实际上是一个很长的二进制向量和一系列随机映射函数。用于检索一个元素是否在一个集合中。它的优点是空间效率和时间效率都远远超过一般算法。缺点是有一定的误识率,和删除困难。 原理:当一个元素加入集合时,通过K个Hash函数将该元素映射成一个位阵列中的K个点,把他们置为1,检索时,只要看看这些点是不是都是1就可以知道它存在不。 如果有一个不为1,则该元素肯定不存在; 如果全是1,则该元素

2017-08-09 15:00:19 471

原创 每日一题——位图

定义:位图(bitmap)就是利用每一位来存储某种状态,但是状态又比较少的情况。 缺点: 1,只能用于整形; 2,可读性差; 3,位图存储的元素个数虽然比一般做法多,但是存储的元素大小受限于存储空间的大小。位图存储性质:存储的元素个数等于元素的最大值。比如, 1K 字节内存,能存储 8K 个值大小上限为 8K 的元素。(元素值上限为 8K ,这个局限性很大!)比如,要存储值为 65535 的

2017-08-09 13:33:51 373

原创 每日一题——字符串循环右移K位,时间复杂度O(N)

例:abcdefgh,循环右移K=3位,就成:fghabcde思路:从上面的例子可以看出,结果就是将后面的K位与前面的N-K位调换位置即可。将字符串逆置,就使得前后位置发生了变化,但是前后两部分的字符顺序出现了逆置,所以在逆置整个字符串时,首先将两小部分分别逆置,最后在整体逆置。 1, abcdefgh ->abcde , fgh 2, edcba , hgf 3, fghabcde/

2017-08-09 10:26:03 855

原创 每日一题——排序(从1-n连续的数进行排序)

有一堆从1到n连续的n个数,要求进行排序,时间复杂度是O(N)思路:从第一个数开始,使得a[i]与a[a[i] - 1]进行交换,直至 i == a[i]-1,即该值已回到了自己的所在位置(0对应1,1对应2,…),然后i++;直至结束。void sort(int a[],int len){ int i = 0; for(;i<len;) { int tmp

2017-08-09 09:49:34 826

原创 每日一题——子树

有两个不同大小的二进制树: T1 有上百万的节点; T2 有好几百的节点。请设计一种算法,判定 T2 是否为 T1的子树。注意事项若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同。您在真实的面试中是否遇到过这个题? Yes 这个题其实不好思考,其中嵌套两层递归,需要清楚程序的运行。

2017-07-23 20:52:54 290

原创 每日一题——二进制数1的个数

普通方法 int countOnes(int num) { // write your code here int count = 0; for(int i = 0;i<32;i++) { if((num & 1) == 1) count++; num >

2017-07-20 22:55:29 430

原创 每日一题——出栈入栈顺序的合法性

判断元素出栈入栈顺序的合法性 例子: 入栈顺序:1,2,3,4,5 出栈顺序:4,5,3,2,1 合法 入栈顺序:1,2,3,4,5 出栈顺序:4,5,3,1,2 不合法思路: 1,先判断,如果两个数据序列有任意一个为空;两个序列长度不相等;或者入栈序列长度小于等于0,这三种情况都肯定不合法; 2,创建一个栈,里面依次放入栈序列数据,再创建一个指针cur指向出栈序列。入栈时,

2017-07-20 20:05:33 557

原创 每日一题——实现取最小值的栈

实现一个栈,要求实现push,pop,min(返回最小值)的时间复杂度均为O(1)思路:使用两个栈,一个是datastack,用来存放每次push进的数据,而另一个是minstack,专门存放当前的最小值。 压栈:如果datastack为空或插入的值小于minstack中的栈顶元素,说明该值是最小值,所以向两个栈中都插入该值;至于其他情况,说明该值不是最小值,所以将该值插入datastack,而将

2017-07-20 09:52:36 308

原创 每日一题——栈实现队列,队列实现栈

1,用两个栈实现队列 2,用两个队列实现栈栈->队列思路:入队时,直接往stack1压入元素; 出队时,判断stack2是否有元素,有则直接弹出栈顶元素,没有则将stack1中的元素一一压入stack2,再弹出stack2的栈顶元素。class MyQueue {public: stack<int> stack1; stack<int> stack2; MyQu

2017-07-20 00:29:26 370

原创 每日一题——删除无头链表的非尾节点、逆向打印单链表

删除无头链表的非尾节点 这个题还有一种出法:在O(1)时间复杂度下删除单链表节点(非表头节点或非尾节点)void deleteNode(ListNode *node) { ListNode* tmp = node->next; node->val = tmp->val; node->next = tmp->next; delete t

2017-07-19 14:19:59 242

原创 每日一题——链表相交问题

1>判断两个链表是否相交,若相交,求交点(链表不带环) 2>判断两个链表是否相交,若相交,求交点(链表可能带环)//链表不带环ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { // write your code here if(headA ==NULL || headB == NUL

2017-07-19 10:21:25 366

原创 每日一题——带环链表

判断链表是否带环。 若带环求环的长度。 若带环求环的入口处。并计算上述问题的时间复杂度求环的入口处(前面几行代码证明带环)至于环的长度,从之前的推论可知,链表起始到环的入口的距离等于相遇点走到环入口的距离,所以环的长度就等于链表起始点到相遇点的距离(代码中的count)。 ListNode *detectCycle(ListNode *head) { // write yo

2017-07-18 23:55:09 373

原创 每日一题——寻找倒数第k个节点

快慢指针法ListNode *nthToLast(ListNode *head, int n) { // write your code here ListNode* begin = head; ListNode* last = head; while(n--) { last = last->n

2017-07-14 17:01:32 286

原创 每日一题——逆置单链表

三指针法ListNode *reverse(ListNode *head) { // write your code here if(head == NULL) return NULL; if(head->next == NULL) return head; ListNode* begin = head; ListNod

2017-07-14 17:00:06 397

原创 每日一题——链表合并

递归class Solution {public: /** * @param ListNode l1 is the head of the linked list * @param ListNode l2 is the head of the linked list * @return: ListNode head of linked list *

2017-07-14 16:42:56 229

原创 shell脚本练习(进度条......)

进度条#!/bin/bashi=0bar=""lable=("|" "/" "-" "\\")while [ $i -le 100 ]do let index=i%4 printf "[%-100s][%d%%][\e[43;46;1m%c\e[0m]\r" "$bar" "$i" "${lable[index]}" bar+='#' let i++ u

2017-06-28 19:29:06 421

原创 进程通信2——消息队列

消息队列是由链表实现的,它是基于system V标准。特点:双向通信;基于消息(数据块);不遵循“先入先出”的原则;生命周期随内核;创建新的消息队列或取得已存在的消息队列 int msgget(key_t key,int msgflg);key:可认为是端口号,由ftok()函数生成; msgflg:IPC_CREAT:如果IPC不存在,生成新的IPC资源,否则打开旧的资

2017-06-27 15:26:35 302

原创 进程通信1——管道、命名管道

匿名管道 管道是一种简单的进程通信(IPC)机制。管道实质上就是pipe函数在内核中开辟了一段缓冲区,有一个读端和一个写端。两个进程之间能够通信的本质:通过fork函数传递文件描述符(子进程是父进程的副本,父进程所有打开的文件描述符都被复制到子进程中,父子进程的每个相同的打开描述符共享一个文件表项)使得两个进程可以访问同一个管道,从而实现通信。特点:单向通信(若实现双向通信,必须建立两个管道);

2017-06-26 16:06:23 408

原创 线程

什么是线程? 线程也被称为轻量级进程,是进程内部的一个执行分支,是程序执行流的最小单位(调度的最小单位)。线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程。一个进程中可以有多个线程,其本质是多个线程在同一进程的地址空间运行。线程不拥有系统资源,但它共享所属进程的资源(文件描述符表,各种信号的处理方式,用户id和组id,当前工作目录)。但有些资源是线程独自享

2017-06-25 01:10:03 323

原创 tcp_server的实现

下面是单进程版本,具体问题在代码中标注。#include<stdio.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdlib.h>#include<string.h>static void usage(const char *proc){ printf("%s [local_ip] [local_port]\n",

2017-06-23 21:32:49 690

原创 端口分类、TCP定时器、URG和PSH对比

端口分类我们这里讲的端口不是传统意义上的物理端口,而是特制TCP/IP协议中的端口。这里端口可以分为TCP端口和UDP端口。两者是独立的,并不冲突。这里端口可以分为三种:周知端口、注册端口、动态端口。周知端口:范围是0~1023,其中80端口分配给www服务,21端口分配给FTP服务等。在地址栏中输入网址时不用指定端口号,因为www服务的端口是默认的80端口。如果你要使用其他端口时,只需在地址后面

2017-06-20 14:05:22 467

原创 TCP握手与挥手

下图是TCP的通讯时序图,并伴有解释 思考:在建立连接时为什么需要“三次握手”?我们来设想一下,如果是两次握手,服务端能够确保它发送的连接数据一定会被客户端收到吗?这显然不可能确保。如果服务端发送的连接数据包丢失,客户端长时间接收不到服务端的信号,他就可能会认为自己发送的连接数据未成功发送给服务端,所以他就会一直向服务端发送连接信号,导致服务端缓冲区里充斥着大量客户端发送的连接请求信号,服务端的很

2017-06-19 19:15:52 383

原创 NAT技术,代理服务器

NAT技术又称网络地址转换技术(Network Address Translation),属于接入广域网技术。是一种将私有(保留)地址转换为合法IP地址的转换技术,他被广泛应用于各种类型Internet接入方式和各种类型的网络中。它不仅解决了IP地址不足的问题,而且还有效地避免了来自网络外部的攻击,隐藏并保护网络内部的计算机。借助于NAT,私有(保留)地址的”内部”网络通过路由器发送数据包时,私有地

2017-06-18 22:55:11 373

原创 生产者消费者模型

我们来认识一下一个模型:生产者消费者模型。在实际的软件开发过程中,可能遇到这种情况:一个模块负责产生数据,另一个模块负责处理数据。注:这里的模块是广义上的模块,可能是进程,线程,类等。产生数据的模块是生产者,处理数据的模块是消费者。但是还不够得上生产者消费者模型,这里还需要一个缓冲区,处于生产者消费者中间,作为中介,生产者往缓冲区生产数据,消费者从缓冲区消费数据。缓冲区的优势: 解耦:假设生产者,

2017-06-18 11:18:55 427

原创 死锁问题

死锁的概念: 指两个及两个以上的进程(线程)在执行过程中,因为争夺资源而造成的一种互相等待的现象。若无外力作用,他们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。这些等待的进程(线程)被称作死锁进程(线程)。对于资源的访问是互斥的,所以当某个进程提出访问资源后,使得有关进程在无力协助下,永远分配不到必须的资源而无法继续运行,这就产生了死锁的问题。死锁产生的条件: 互斥条件;资

2017-06-10 18:20:19 350

原创 AVL树的实现

AVL树又名高度平衡的搜索二叉树,上一篇文章我们讲到二叉搜索树时,说到它存在一个问题:退化,这使得它的时间复杂度从O(lgN)降到了O(N)。为了解决这个问题,出现了一棵新的树,也就是AVLtree,我们先来看看它的性质: 1,它是一棵搜索 二叉树,所以满足每个节点的值大于左子树中任意节点的值,并且小于右子树中任意节点的值。 2,它是一棵平衡树,他要求每个节点的左右子树的深度之差不能超过1,即这

2017-06-10 18:05:29 841

原创 红黑树的模拟实现

这里我来提供两篇写的不错的文章供大家参考: http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html http://blog.csdn.net/chenhuajie123/article/details/11951777 http://www.cnblogs.com/v-July-v/archive/2011/01/03/2

2017-06-06 23:58:46 464

原创 搜索二叉树的实现

要模拟实现搜索二叉树,必须了解他的性质: 搜索二叉树的性质: 1,每个节点都有一个用于搜索的关键码,每个节点的关键码都不一样; 2,一个节点的左子树上所有的关键码总是小于它,而右子树的关键总是大于它; 3,每一个子树都是一个搜索二叉树;这里简单来模拟实现一下搜索二叉树(递归和非递归): 插入: 当插入一个节点时,你会发现新插入节点不会影响原先树的结构,所以不用调整,这是简单之处。

2017-06-04 23:40:16 491

原创 二叉树线索化

二叉树的线索化可以使得二叉树的非递归遍历不需借助栈或队列这种数据结构,最主要的是可以为之提供迭代器。线索化二叉树有三种方式:前序线索化、中序线索化、后序线索化(后序线索化需要三叉链结构)这里主要讲前序线索化和中序线索化,并为中序线索化提供迭代器。 线索化的思想就是将一颗二叉树遍历转换成有序双向链表进行访问。这样二叉树的节点结构就应该多一个前驱和后继的线索化标志。 节点结构 enum Point

2017-05-18 23:00:02 449

原创 二叉树基本操作

要想试着去模拟构建一棵二叉树,就必须了解二叉树在系统中是如何保存的,实际上,二叉树的节点保存在一个数组中,我们以下面二叉树为例:(#为空节点,占一个子节点位置) 满二叉树:每一层节点都是完整的,每层节点数(2^(n-1)) 完全二叉树:最后一个节点之前不存在空节点。 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。 1,求节点个数:(递归)思路:root为空时,返回0;root

2017-05-17 17:18:04 611

原创 堆有关的面试题(后续补充)

//*********************************************************//面试题:N个数找出最大的前K个(N超级大)////思路:用前K个数建个小堆,然后向后遍历其余数,凡是遇到比堆根节点大的,// 就替换根节点,然后向下调整,使之始终保持小堆,然后继续遍历,// 直至访问完数据。这样就将前K个大的数据全放在了堆中。//

2017-05-15 17:59:29 841

原创 STL list的简单实现及list迭代器失效问题

上一篇我针对不同的数据结构来演示了迭代器的使用,今天我们主要来看看STL list的使用及他的模拟实现。 首先我们来实现list节点的结构体。看下面代码:templateT>struct __ListNode{ T _data; __ListNode* _next; __ListNode* _prev; __ListNode(const T& x)

2017-04-27 18:23:04 1419 2

原创 迭代器的使用

这一篇以至下一篇文章我来讲解关于迭代器。今天呢,我们重点了解迭代器以及了解掌握迭代器的使用。 迭代器(iterator)有时又称游标(cursor),是程序设计的软件设计模式,他是专门为访问容器而设计的一种数据结构,他实际是对访问容器这一操作进行了封装。也有一种说法是迭代器是指针的封装。和智能指针有点相似。 迭代器是一种对象,他用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容

2017-04-24 22:15:06 569

原创 C++异常

今天我们来说说C++中有关异常的处理方法,异常的常见用法及特性。 一,有关错误的处理方法返回错误码;终止程序;返回合法值,让程序处于某种非法的状态;调用一个预先设置好出现错误时调用的函数——回调函数;异常处理; 当一个函数发现自己无法解决的错误时抛出异常,让函数的调用者直接或间接的解决这个问题。二,异常的抛出和捕获异常是通过抛出对象来引发的,该对象的类型决定应该激活哪

2017-04-22 16:09:15 362

转载 C++继承详解二——默认成员函数

在这一篇文章开始之前,我先解决一个问题。   在上一篇C++继承详解之一——初探继承中,我提到了在派生类中可以定义一个与基类成员函数同名的函数,这样派生类中的函数就会覆盖掉基类的成员函数。   在谭浩强的C++程序设计这本书第十一章,351页最下面有这么一段话: 可在派生类中声明一个与基类成员同名的成员函数,则派生类中的新函数会覆盖基类的同名成员,但应注意:如果是成员函数,不仅应是函数名相同

2017-04-18 09:37:32 1858

原创 C++模板详解

在平时写代码时,我们总会遇到这种问题:实现一个很简单的功能,但是由于传参过程中不同于形参类型的实参类型会使得你不得写多个功能相似的函数分别去实现他们,这就会造成许多问题,比如代码冗余,函数名太多造成名字空间的污染。这就需要其他方法来解决这种问题。之前在C语言学习中,我们学到了宏这一概念,宏可以一定程度上解决这个问题。但是宏也有它的缺点: 宏替换 宏是在预编译时展开的; 宏只是简单地文本替换;

2017-04-09 19:21:07 492 1

原创 Linux进程管理之PCB

首先呢,我们来认知一下程序和进程。程序是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。而进程是操作系统对一个正在运行着的程序的一种抽象。 我呢是下面这样来理解程序与进程的区别的,有不全面的地方多多指教。 PCB是什么呢?下面我们就来详细聊聊这PCB。 每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息。其作用是使一个在多道程序环境下不能独立运行的程序成为一个

2017-04-09 15:06:04 2441

原创 Linux下简单进度条的实现

首先呢,我给出代码和进度条效果图,后面来进行详解。 如上图所示,这进度条实现的也着实简单(略显尴尬),但进度条原理本质就是如此,只不过多了些修饰,下面来进行详解。 unistd.h是C、C++程序设计语言中提供对POSIX(可移植操作系统接口)操作系统API的访问功能的头文件的名称。 usleep函数是延时函数,单位为微秒。下面看个有趣的现象 看上面这段简单的代码,他实现的效果是先延迟三秒,

2017-04-09 11:51:12 646

空空如也

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

TA关注的人

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