- 博客(66)
- 收藏
- 关注
原创 测试用例的设计方法
测试用例设计方法等价类划分理论知识等价类划分是一种典型的黑盒测试方法。这一方法完全不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。 等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭示程序中的错误都是等效的。等价类合理地假设:某个等价类的代表值,与该等价类的其他值,对于测试来说是等价的。因此,可以把全部的输入数据划分成若干的等价类,在每一个等价
2018-02-05 11:04:02
639
原创 【shell脚本】入门篇(一)
Shell的作⽤是解释执行用户的命令,用户输⼊⼀条命令,Shell就解释执行⼀条,这种⽅式称为交互式(Interactive),Shell还有⼀种执行命令的方式称为批处理(Batch),⽤户事先写⼀ 个Shell脚本(Script),其中有很多条命令,让Shell⼀次把这些命令执⾏完,⽽不必⼀条⼀条地敲命令。 Shell脚本和编程语⾔很相似,也有变量和流程控制语句,但Shell脚本是解释执⾏的,不
2018-01-11 17:24:10
821
原创 求数组中出现次数超过一半的数字
一个数组中有一个数字的次数超过了数组的一半,求出这个字符。如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2#includeusing namespace std;bool _CheckArray(int* data, int length){ if ((data == NULL) && (length <= 0)) return
2017-07-25 16:13:49
430
原创 链表翻转(给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5)
链表翻转。给出一个链表和一个数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,提示:这个题是链表逆置的升级变型。代码:pNode RotateList(pNode* pHead, DataType k){ pNode pPre = Find(*pHead, k); pPre
2017-07-25 15:21:11
1752
原创 二进制整数中1的个数
两种解法:第一种:为了避免死循环, 可以让num和1按位与,判断最低位是不是1,然后让1左移再与num按位与 判断次低位是不是1,然后按照这种模式一直循环 ,直到1左移32次截止;这种方法不会死循环,可以正确判断出正数和负数中1的个数,但是不论数字大小均要循环操作32次,效率不高。代码://int NumberOf1(int num)//{// int FLAG = 1;//
2017-07-22 16:03:34
319
原创 判断元素出栈、入栈顺序的合法性
元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。 定义一个栈s,入栈序列为dataPush,出栈序列为dataPop及dataPop2,长度分别为len1和len2, len3。在判断的方法中,如果两个序列为空或长度不等,则不合法,出栈序
2017-07-22 15:51:43
1078
原创 使用两个队列实现一个栈
两个队列实现一个栈队列是先进先出,而栈是先进后出;考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头;由于栈的pop弹出栈顶元素,而队列的pop也是弹出栈顶元素,所以我们需要特别处理的是插入操作。由于往栈中添加元素相当于往队列头添加元素,因此我们需要在两个队列中进行元素的转移,比较简单的实现是:1.queue1和queue2在任一时刻至少有一个为空,即如果有元素,所以
2017-07-19 10:54:25
286
原创 使用两个栈实现一个队列
2. 两个队列实现一个栈队列是先进先出,而栈是先进后出;考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头;由于栈的pop弹出栈顶元素,而队列的pop也是弹出栈顶元素,所以我们需要特别处理的是插入操作。由于往栈中添加元素相当于往队列头添加元素,因此我们需要在两个队列中进行元素的转移,比较简单的实现是:1.queue1和queue2在任一时刻至少有一个为空,即如果有元素,所以元素只在同一个队列中。 2.当有元素需要插入时,将插入的元素插入到空的队列中,并将另一非空队列的元素转移到该队列中,
2017-07-19 10:42:28
286
原创 Linux定时任务:crond和crontab详解
1.crond命令:使用crond定时任务的原因:linux系统的定时任务crond,相当于我们平时生活中的闹钟的功能。可以满足周期性执行任务的需求。要查看linux是否已经安装crond,使用命令:rpm -qa | grep croncrond是一个linux下的定时执行工具(相当于windows下的scheduled task),可以在无需人工干预的情况下定时地运行任务t
2017-07-08 11:58:20
4303
原创 【数据结构】二叉树前中后序遍历、层序遍历(递归实现)
这里使用前序遍历方式建立二叉树主要介绍:递归实现二叉树建立,前序、中序、后续、层序遍历 ,求二叉树深度及节点个数 本文使用序列:array[10] = { 1, 2, 3, -1, -1, 4, -1, -1, 5, 6 };前序遍历算法:若二叉树为空,则算法结束,否则:1)先访问根节点 2)前序遍历访问左子树 3)前序遍历访问右子树前序遍历结果:1 2 3
2017-07-05 10:48:49
880
原创 【shell脚本】脚本实现彩色进度条
实现代码:########################################################################## File Name: procbar.sh# Author: liumin# mail: 1106863227@qq.com# Created Time: Sun 02 Jul 2017 09:21:46 AM CST##
2017-07-02 10:38:22
3947
原创 【数据结构】顺序队列(链表实现)
队列介绍队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。进行插入操作的一端称为队尾,通常称为入队列;进行删除操作的一端称为队头,通常称为出队列。队列具有先进先出的特性(FIFO)。队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而异,将其称为链队列。实现代码://队列必须一端进行插入(队头)一端进行删除(队尾)#if
2017-06-27 23:56:56
379
原创 【数据结构】顺序栈(顺序表动态实现)
栈的概念栈:一种特殊的线性表,其只允许在在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一段称为栈顶,另一端称为栈底。不含任何元素的栈称为空栈,栈又称为后进先出的线性表。栈的特点:后进先出(LIFO)顺序栈:顺序堆栈和顺序表数据成员相同,不同之处,顺序堆栈的入栈和出栈操作只允许对当前栈顶进行顺序堆栈所有操作的时间复杂度均为O(1)。
2017-06-26 15:36:07
651
原创 链表面试题(三):链表相交,链表带环,链表带环相交
接上一篇链表面试题博客:11. 判断单链表是否带环?若带环,求环的长度?求环的入口点?1)带环判断:定义两个指针,pFast、pSlow,其中两指针速度pFast = 2pSlow ,若带环总会有pFast == pSlow,并返回相遇节点,若不带环 这个指针的最后节点都为空。2)求环的长度,定义计数器、 保存当前相遇节点、从相遇节点开始遍历,计数器计数,当再次与相遇节点相遇时 ,计数
2017-06-24 01:35:25
504
原创 链表面试题(二):冒泡排序、合并两个有序链表、查找中间节点、查找倒数K个节点
这里接上一篇博客,7. 单链表排序(冒泡排序&快速排序)//7.单链表排序(冒泡排序)void BubbleSort(pNode* pHead){ assert(NULL != pHead); pNode pCur = *pHead; pNode pPrev = NULL; int index1 = 0; int index2 = 0; while (pCur != p
2017-06-23 01:22:52
571
原创 链表面试题(一):逆序打印链表、无头链表删除插入节点、约瑟夫环、逆置单链表
1. 比较顺序表和链表的优缺点,说说它们分别在什么场景下使用?1)顺序表支持随机访问,单链表不支持随机访问。2)顺序表插入/删除数据效率很低,时间复杂度为O(N)(除尾插尾删),单链表插入/删除效率更高,时间复杂度为O(1)。3)顺序表的CPU高速缓存效率更高,单链表CPU高速缓存效率低。2. 从尾到头打印单链表//2.从尾到头打印单链表void ReverseP
2017-06-23 01:13:13
943
原创 大小端模式介绍及两种检测方式
大端模式(big endian)和小端模式(little endian)。在我们发送数据的时候,我们首先要确定是大端还是小端模式来进行的,在接收方接收的数据必须知道数据是大端还是小端模式,才能正确地读取和存储数据起来,否则就会出错。一个32位的二进制在内存中的存储时有2中分布方式:高字节对应高字节(大端模式)、高字节对应低地址(小端模式)。有些时候CPU公司用大端(C51单片机);有些
2017-06-22 01:40:54
2525
1
原创 【数据结构】C语言实现链表
链表的特点:长度不固定,可以任意增删。存储空间不连续,数据元素之间使⽤指针相连,每个数据元素只能访问周围的⼀个元素(根据单链表还是双链表有所不同)。存储密度小,因为每个数据元素,都需要额外存储⼀个指向下⼀元素的指针(双链表则需要两个指针)。要访问特定元素,只能从链表头开始,遍历到该元素,时间复杂度为 O(n)O(n)。在特定的数据元素之后插⼊或删除元素,不涉及到其他元素的移
2017-06-22 01:09:14
477
原创 【数据结构】C语言实现顺序表(动态顺序表)
相比上一篇博客所写的静态顺序表,本篇介绍的动态版本主要通过增加动态扩容以及内存资源回收两个接口实现动态顺序表使得顺序表的使用相较上一个版本比较灵活具体实现代码:SeqList.h#ifndef __SEQLIST_D_H__#define __SEQLIST_D_H__#include#include#include#includetypedef int DataT
2017-06-21 09:32:44
595
原创 【数据结构】C语言实现顺序表(静态顺序表)
静态顺序表的定义:顺序表的概念? --用⼀段地址连续的存储单元依次存储数据元素的线性结构。为什么要实现顺序表? --比较数组...顺序表的特点:访问特定元素的时间复杂度为O(1)增加、删除⼀个元素的时间负责的为O(n)长度固定、存储连续顺序表定义:typedef int DataType;#define MAX 100 typedef struct se
2017-06-21 07:50:57
760
原创 【shell脚本】eval命令详解及命令代换
1.命令代换在shell脚本语言中有两种命令代换方式1>由反引号(`...`)括起来的也是⼀条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。DATE=`date`echo $DATE2>也可以使用 $() 代换DATE=$(date)示例:两者间的区别和联系:联系:均可用于命令代换区别:1) Bash中的后置引用 `CO
2017-06-15 01:33:58
1769
原创 类型提升问题
int main(){ int array[] = { 23, 34, 45, 56, 67, 78 }; unsigned int key = sizeof(array) / sizeof(array[0]); int d = -1; int x = 3; if (d <= key - 2) x = array[d + 1]; printf("the value of x i
2017-06-12 22:39:25
435
原创 Linux网络编程【七】:TCP协议高性能服务器(http)模型之I/O多路转接poll
poll:poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多。不同与select使⽤三个位图来表⽰三个fdset的⽅式,poll使⽤⼀个 pollfd的指针实现该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它
2017-06-12 18:59:30
781
原创 Linux网络编程【六】:TCP协议高性能服务器(http)模型之I/O多路转接epoll
什么是epoll?epoll是linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。注:epoll除了提供s
2017-06-12 01:32:41
654
原创 Linux网络编程【五】:TCP协议高性能服务器(http)模型之I/O多路转接select
I/O多路转接之select系统提供select函数来实现多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。select:该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它。参数意义:nfds:待测试描述符个数。最大文件描述符+1readfds/writefds/exceptfds:分别对应于需要检测的可读文件件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。异常原因: 1.
2017-06-05 18:17:15
594
原创 Linux网络编程【四】:进程池、线程池原理及简单线程池源码分析
进程池和线程池概述进程池和线程池相似,所以这里我们以进程池为例进行介绍。如没有特殊声明,下面对进程池的讨论完全是用于线程池。进程池是由服务器预先创建的一组子进程,这些子进程的数目在 3~10 个之间(当然这只是典型情况)。线程池中的线程数量应该和 CPU 数量差不多。进程池中的所有子进程都运行着相同的代码,并具有相同的属性,比如优先级、 PGID 等。当有新的任务来临时,主进程将通过某种方式选择进程池中的某一个子进程来为之服务。相比于动态创建子进程,选择一个已经存在的子进程的代价显得小得多。至于主
2017-06-02 01:20:49
1002
原创 Linux网络编程【三】:TCP服务器多进程和多线程(http访问)版本
为了让服务器同时接受多个客户端访问,所以需要多进程或者多线程多进程版本:#include#include#include#include#include#include#include#includestatic void usage(const char* proc){ printf("%s [ip] [port]", proc);}int startup(c
2017-06-02 00:41:17
1104
原创 【C语言】注释转换项目实现
编写一个小项目将一个一个文件中的注释都转换成C++的注释风格设计部分:(1)头文件模块:包括模块中需要引用的头文件定义,需要实现的主要函数的声明(2)头文件中主要函数模块的实现:各个函数部分实现的细节(3)测试函数:检验函数模块的功能(4)写入一个输入文件(5)运行结果记入一个输出文件中
2017-05-28 12:47:32
278
原创 【C语言】通讯录:动态开辟内存版和文件版本
动态开辟内存:tellist.h#ifndef __TELLIST_H__#define __TELLIST_H__#define NAME 10#define SEX 5#define TEL 12#define ADDR 20#define MAX 50typedef struct PEOPLE{ char name[NAME]; char sex[SEX];
2017-05-28 12:33:09
457
原创 【C语言】三子棋游戏
#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#includeenum OP{ Exit, Playgame};char arr[3][3] = { 0 };int arr_size = 9;void menu(){ //菜单初始化 printf("******************
2017-05-28 12:26:04
341
转载 函数的调用约定(_cdecl,_stdcall,_fastcall,_pascal)
microsoft的vc默认的是__cdecl方式,而windows API则是__stdcall,如果用vc开发dll给其他语言用,则应该指定__stdcall方式。堆栈由谁清除这个很重要,如果是要写汇编函数给C调用,一定要小心堆栈的清除工作,如果是__cdecl方式的函数,则函数本身(如果不用汇编写)则不需要关心保存参数的堆栈的清除,但是如果是__stdcall的规则,一定要在函数退出(ret)前恢复堆栈。1.__cdecl 所谓的C调用规则。按从右至左的顺序压参数入栈,由调用者把参数弹
2017-05-27 17:12:22
478
原创 Linux网络编程【二】:UDP socket套接字详解
与TCP socket一致,基于UDP socket(无连接)编程分服务器端和客户端服务器端过程:1.创建套接字(socket)2.将套接字绑定到一个本地地址和端口上(bind)3.用返回的套接字和客户端进行通信(recvfrom)4.返回,等待另一个客户请求。5.关闭套接字。客户端过程:1.创建套接字(socket)2.和服务器端进行通信(sendto)3.关闭套接字而与TCP不同的是:(1)socket函数中type类型SOCK_DGRAM是一种无连接的Socket,对应于无连接的UDP服务应用
2017-05-27 00:41:10
979
原创 Linux网络编程【一】:TCP socket套接字详解
1.socketsocket这个词可以表示很多概念: 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket。在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成 的socketpair就唯一标识一个连接。 socket本身有“插座”的意思,因此用来描述网络连接的一 对一关系
2017-05-26 23:51:48
8308
1
原创 剑指offer面试题4:替换空格和合并两个有序数组
题目:请实现一个函数,把字符串中的每个空格替换成20%。例如:输入“We are happy.” 输出“We20%are20%happy”看完题目会想到,原来一个空格字符,替换后变成‘2’、‘0’、‘%’三个字符,意味着字符串变长。有两种解决方案:一:创建新的字符串并在新的字符串上做替换,我们可以分配足够多的内存。二:在原来的字符串上做替换,那么就有可能覆盖修改在该字符串后面的内存。
2017-05-23 13:08:07
491
1
转载 TCP状态转换
注:主动、被动 与 服务器、客户端没有明确的对应关系。这个图N多人都知道,它排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻的认识,不能只停留在一知半解之中。下面对这张图的11种状态详细解析一下,以便加强记忆!不过在这之前,先回顾一下TCP建立连接的三次握手过程,以及关闭连接的四次握手过程。1、建立连接协议(三次握
2017-05-21 16:26:12
322
原创 TCP三次握手四次挥手
三次握手:所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接
2017-05-21 16:02:48
303
原创 TCP报头中URG、PSH标志详解
URG:紧急标志。紧急标志为"1"表明该位有效。ACK:确认标志。表明确认编号栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。PSH:推标志。该标志置位时,接收端不将该数据进行队列处理,而是尽可能快地将数据转由应用处理。在处理Telnet或rlogin等交互模式的连接时,该标志总是置位的。RST:复位标志。用于复位相应的TCP连接。SYN:同步标志。表明同步序列编号栏有效。该标志仅在三次握手建立
2017-05-21 15:32:08
3001
原创 网络协议中端口类型及分类
端口:在网络技术中,端口有两层意思:一个是物理端口,即物理存在的端口,如:集线器、路由器、交换机、ADSL Modem等用于连接其他设备的端口;另一个就是逻辑端口,用于区分服务的端口,一般用于TCP/IP中的端口,其范围是0~65535,,0为保留端口,一共允许有65535个端口比如用于网页浏览服务的端口是80端口,用于FTP服务的是21端口。端口号:由于物理端口和逻辑端口数量较多,为了对端口进行区分,将每个端口进行了编号,即就是端口号。分类:1.按端口号划分(1)公认端口(Well Know
2017-05-21 14:46:44
15209
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人