- 博客(853)
- 资源 (11)
- 问答 (2)
- 收藏
- 关注
原创 编程之美3.2 电话号码对应英语字母
这也是一道很常见的题目,好多类似的题目用的也是同样的解法,这道题目的意思是,我们的手机上的数字键上面对应着英文字母,那么这个数字可能对应3个,也可能对应4个,也有可能对应0个,那么,当我输入一串数字后,需要给出所有这些数字可能对应的英文字母。 说到这里,相信大家也就明白了,这其实就是全排列,只不过我们首先需要给出已知条件,即数字对应着哪些字母,对应着几个字母,因为要做全排列,就一定要知道
2014-10-19 12:51:22 2554
原创 编程之美3.1 字符串移位包含问题
这道题目的意思是给定一个字符串,作为源字符串,之后给出其他的字符串,确定源字符串是否能够经过旋转而得到给定的字符串,即移位包含问题。 假如,给定一个字符串 abcdefg,接着给定字符串 cdefgab,很显然,给定的字符串是可以经过源字符串旋转而得到的,但是,给定字符串 cdegfab 就不能由源字符串经过旋转而得到。 当然,这道题有很多解法,我们可以经过判断字符串中字符的位
2014-10-17 19:02:28 1644
原创 编程之美2.17 数组循环移位
这是一个很经典的题目,题目的大概意思是这样的: 有一个存储字符串的数组,需要按照要求循环移动数组中的字符,例如,数组中存储字符 abcd1234,循环右移4位,之后,会得到这样一个字符数组 1234abcd,当然,左移也是同样的解法 想想这个问题不是很难,顺序依次移动就可以了,这样做的话,时间复杂度是O(n2)量级的,那么,有没有更快的方法呢? 首先,我们需要对数组的
2014-10-16 14:39:18 1572
原创 编程之美2.16 最长递增子序列
这道题目要求返回一个数字,这个数字代表一个数组中最长的递增子序列,当然,不要求这个序列是连续的,比如,有这样一个数组:{1, 3,5,7, 2, 9},那么这个数组的最长递增子序列就是5,即1, 3, 5, 7,9 解决这道题目的思想就是:后面的数字只要是大于前面递增子序列的最大值,那么,它就一定大于前面所有的序列,既然需要知道前面保存的序列,那么,我们这里就需要一个辅助数组,数组
2014-10-16 09:54:26 2477
原创 编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)
首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题。这个问题无疑就是把原问题扩展到二维的情况。 想起来这个问题也不是很难,我们可以求解一维矩阵的思想,即我们可以固定住行(或列),之后,我们去求解列(或行)所构成的最大和就可以了。 这里的解法利用的是固定住行,然后求解需要寻找的列之和,利用书中提到的一个公式: 以左上角的元素(1,1)和当前元素(i,j)为
2014-10-15 16:07:57 1984
原创 编程之美2.14 求数组的子数组之和的最大值
这是一个在面试中出现概率很高的一道题目,就拿我来说吧,面试了5家公司中,两家公司问了这道题目,可见,这道题目是非常经典的。 解题思想也不是很难,我熟悉的有;两种解题办法: 1. 一直连加,终止当前序列的条件是连加的和是负数 因为,一个数加上一个负数之后肯定是没有原来的数值大,所以,这肯定是没有意义的,最终,我们利用这个思想得到如下的解法。 函数声明:ll D
2014-10-14 14:40:42 1693
原创 编程之美2.13 子数组的最大乘积
这道题目是求 n-1 个数的最大乘积,即数组大小为 n,则会存在 n 个 n-1 的连续数字,那么,我们需要寻找的是最大的那一个乘积。 其实看到题目,感觉很简单,循环走两遍数组就可以得到结果,但是,那样的话,复杂度是平方量级的,如果一个数组中元素很多,那么,时间效率上是不能接受的,所以,需要重新思考问题,寻找简洁的解法。 这里,我们可以利用辅助数组的办法,把需要乘在一起的数字保
2014-10-14 09:44:24 1970
原创 编程之美2.12 快速寻找满足条件的两个数
这道题目的意思是,在一个数组中寻找两个数,使这两个数的和等于给定的数(找到任意一组就可以了)。 题目读完之后,感觉这道题目还是很简单的,就是遍历数组呗,走两遍,即可以在O(n2)时间复杂度内解决这个问题。不过,仔细想想之后,复杂度还是可以降低的。 首先,我们可以对数组进行排序,这样,得到的数组就是一个有序数组(假设数组是递增的),那么,我们可以利用两个指针,一个指针指向数组的第
2014-10-08 16:33:43 1590 3
原创 编程之美2.10 寻找数组中的最大值和最小值
这个问题其实很容易解决,就是循环遍历一遍数组,然后找到数组中存在的最大值和最小值就可以了,书中主要讨论的问题是比较次数较小的方法,不过,书中已经证明了,无论用什么方法最少的比较次数也就是循环遍历一遍的比较,结果是O(1.5N)的,所以,很容易的可以解决这个问题。 第一种方法: 函数声明:void DutFindMaxAndMinInArray_1(int*, int, int&
2014-10-08 10:09:04 2258 2
原创 编程之美2.9 斐波那契数列
斐波那契数列是我们在学习C语言的时候,在递归那一章的经典实例,当然,还会有汉诺塔的例子。 这个问题时这样定义的: 0 (x f(x) = 1 (x == 1) f(x - 1) + f(x - 2) (x > 1) 看到这个递推公式后,我们很容易可以写出如下的代码:
2014-09-29 15:00:53 1979 4
原创 编程之美2.8 找符合条件的整数
这个题目是,给定一个整数 N,需要寻找另外一个整数 M,使得 N * M 得到的结果十进制表示中只存在1和0两个数字。首先看到这个题目,第一思想肯定是 使 M = 1,并依此递增 M 的值,直到 N * M 获得想要的效果,但是,如果 N 很大呢,那么计算量也是很大的,所以,我们需要寻求更好的解决办法。 书中提到的解决办法有点复杂,这里我介绍的方法也是非常简单的,就是倒过来思考问题,我们
2014-09-28 15:19:34 1655
原创 编程之美2.7 最大公约数,最小公倍数
书中的题目是求两个数的最大公约数,其实这个问题时当我们学习C语言的时候老师就讲过的算法,和教学中的求素数是一个类型的问题。 我们当时学的方法是 “辗转相除法”,即利用公式: f(x, y) = f(y, x % y),直到 x % y == 0,取x就是两个数的最大公约数。 但是书中说道,乘除运算太浪费时间了,所以,我们可以换一种方法去思考这个问题,乘除不能用,就只能是加减了,
2014-09-27 14:45:53 2504 2
原创 编程之美2.5 寻找最大的K个数
在一个数组中寻找最大的K个数,我们首先说一种非常简单的方法,利用快速排序中的分割算法,即我们经常看见的partition。这个函数会返回一个 int 类型的值,这个值代表的是前一半数字和后一半数字的分割点,前一半数字都小于等于后一半数字(递增排序),所以,我们只要找到相对应的分割点,即可以找到最大的K个数,或者最小的K个数,这就是利用线性方法可以完成任务的方法。 首先,给出函数声明:in
2014-09-27 12:48:53 1848
原创 编程之美 2.4 1的数目
这道题的意思是,给定一个数n,那么从1到n这n个数中,1出现了几次。这个问题开始看,肯定不容易做,往往都是利用最笨的方法,一个数一个数的找就行了,那么如果n很大,就需要非常多的时间了,书中提供了更好的方法,需要发现数字中存在的相关规律:对于数abcde,c这位出现1的次数分以下情况:1.若c > 1,结论是(ab + 1)* 100; 2.若c == 1,结论是(ab)* 100
2014-09-25 16:33:55 1982
原创 编程之美2.3 寻找发帖水王
这道题目由于不容易写测试用例,所以,可以把题目转换为:在一个数组中,有一个数字出现的次数超过了数组大小的一半,这和题目原意是一样的。 这道题目的思想是我们同时去掉数组中两个不一样的数字,那么,数组中原来存在的规律是不变的(仅针对这个题目)。 好吧,还是先给出函数声明:/*2.3 寻找发帖水王*/bool DutVerify(int*, int, int);int DutFi
2014-09-25 12:12:44 1430
原创 编程之美2.2 不要被阶乘吓倒
开始看到这道题目的时候,我还以为是利用字符串表示整型数的思想,后来一看,由于是一个数的阶乘,那么,如果这个数本身就很大,那么,即使是利用字符串表示也是不合理的,所以,看了下这道题的解释,书中给出了一个公式之后就明白了题目的意思。 首先,我先把函数声明和题目要求贴出来:/*2.2 不要被阶乘吓倒*//*2.2.1 N!的末尾有多少个0*/int DutCountOf0InFactori
2014-09-24 14:47:49 1631
原创 C 函数 strstr 的高效实现
C函数库中有一个函数 strstr(char*, char*),它实现的是在一个原字符串中查找一个子串,如果找到这样的一个子串,返回这个子串在原字符串中的起始位置,若没有找到这样的一个子串,则返回NULL。 但是,函数库中实现的仅是一般情况下的查找,即没有做太多优化,在执行一些特殊的字符串时效率很低,所以,在很多面试中要求改进这个算法,实现效率高的 strstr 算法,这里,我对原算法进
2014-06-20 17:37:57 4271 1
原创 别顾着学习工作,没了生活
首先,需要说明的是这是一篇无码的文章,这里不谈任何关于技术的问题,只是写写学习工作之外的生活。 好久没更新博客了,因为自己太忙了,也太累了,剩下的空闲时间都是拿来休息了,所以,迟迟没有动笔,说来,最近也有很多事,论文需要写,项目需要做,不懂的需要学,着实辛苦,当然,也有好久没有出去玩。。。 今天阳光明媚,非常适合出去散步,踏青之类的活动,由于之前的一天去看海了,所以,今天打算找个公园转转。
2014-04-06 18:24:06 9806 101
转载 结合typedef更为直观的应用函数指针
“函数指针”的本质是一个指针变量,只不过该指针变量指向函数。1:简单应用形式1:返回类型(*函数名)(参数表)[html] view plaincopy#include stdio.h> char* (*test)(char *);//定义一个函数指针,使用之前对其赋值 char* fun(char *ch)//定义一个普通函数 { return ch; } void
2014-03-22 10:52:45 1632 1
转载 C语言的那些秘密之---函数返回局部变量
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意
2014-03-21 22:16:18 1845
转载 STL内存分配器:allocator
一、STL泛型容器 与 内存管理1.1 STL泛型容器中隐藏了内存管理工作 STL提供了很多泛型容器,如vector,list,map等。程序员使用时之关心如何存放对象,不用关心如何管理内存。 容器会根据需要自动增长内存,在退出其作用域时,也会自动销毁占有的内存。 STL容器巧妙的避开了繁琐而且容易出错的内存管理工作。二、STL默认的内存分配器2.1 STL默认的内存
2014-03-14 14:50:44 2275
原创 数据结构 -- 二叉树
这篇文章介绍的是经典的数据结构--二叉树,在这篇文章里介绍了几乎二叉树的所有操作。 二叉树给我们最重要的印象莫过于递归,因为这棵树就是递归的,所以,我在解决各个问题时大部分都用到了递归,代码简单且易于理解,好吧,这篇文章的代码有点长,贴出来吧:头文件:/* * dlut_bitree.h * * Created on: 2014年1月13日 * Author: DLU
2014-01-16 08:51:44 2524 7
原创 数据结构 -- 双向循环链表
这篇文章写的是双向循环链表,这也是个非常经典的数据结构,我们在看 Linux 内核代码时就经常会遇到它。比如,在Linux的内核中实现进程描述符,使用的就是双向循环链表,因为它使用起来很方便,每个节点不只是有 data 字段,还有 prev , next 字段,对于向前和向后查找相应的节点很方便,下面贴出实现代码,仍然是很简单的操作,且没有过多的错误控制:头文件:/* * dlut_dclist
2014-01-15 08:46:53 2333
原创 数据结构 -- 队列
这里实现的队列依然是使用这篇文章中的单链表http://blog.csdn.net/dlutbrucezhang/article/details/18225473来实现的,并不复杂,且不含有过多的错误控制,同样需要自己进行正确的输入,这个队列实现的一系列操作类似于前一篇文章写到的栈,提供了基本的操作,好吧,直接把代码贴下吧:头文件:/* * dlut_queue.h * * Created
2014-01-14 14:07:29 1594
原创 数据结构 -- 栈
这里实现的栈是利用上一篇文章中的单链表来实现的:http://blog.csdn.net/dlutbrucezhang/article/details/18225473,这个栈的实现也是一些基本的操作,也是没有什么错误控制的,哈哈,其实一般实现的栈也不会提供错误控制的,用的不好程序崩溃了那也是自己的事,好吧,代码贴出来:头文件:/* * dlut_stack.h * * Created o
2014-01-14 08:51:30 1961
原创 数据结构 -- 单链表
快要放假了,实在是待不住了,论文也看不下去,也没啥其他的事做,就写写常用的数据结构吧,正好下个学期就要找工作了,也是方便以后自己使用这些数据结构,好吧,这里实现的数据结构没有太多的错误控制,需要自己去判断什么不应该为空,第一篇文章贴出最经典的单链表的实现:头文件:/* * dlut_list.h * * Created on: 2014年1月13日 * Author: DLUT
2014-01-13 17:00:25 2017
原创 线程相关函数讲解
我们都知道,Linux 中的线程其实就是进程,只是线程共享进程的地址空间,其他的没有什么特别,线程也具有进程描述符,内核栈,thread_info 结构等等,进程所具有的东西。 创建线程我们需要用到的函数是 pthread_create,线程和进程一样,需要进程进行等待,以释放线程占用的其他资源,哈哈,这又和进程的实现是一样的,主线程等待子线程的函数是 pthread_join,好吧,下
2014-01-09 20:37:01 1939
原创 利用文件锁控制程序的执行
我们在写程序的时候,需要同步控制的时候往往利用线程锁对程序进行加锁控制,哈哈,昨天看《UNIX网络编程》,里面提到对程序可以利用文件锁进行程序控制,觉得挺有意思,就拿过来试试。 首先,我们需要知道一个库函数和一个结构体:fcntl,struct flock,没错,函数的意思就是文件控制,结构体的意思是文件锁结构。由于,之前看到过这两个东西,网上的介绍也很多,在这里就不多做介绍了,不懂的同
2014-01-08 10:56:58 2133 2
原创 C函数 mktemp
最近写程序的时候需要临时文件,于是开始查怎样生成一个临时文件,但是,需要注意,这个临时文件必须是唯一的,不能与其他已经存在的文件有冲突,所以,大部分的函数都会失效,不过,mktemp 函数可以做到这一点,首先,我们来看一看这个函数的原型: char * mktemp(char *template); 我们需要注意,template 代表的是传入的文件名,这个文件名必须以 XXX
2014-01-08 09:04:55 5520 3
转载 Linux 有趣命令
1. sl 命令sl是指“steam locomotive(蒸汽机车)”,你会看到一辆火车从屏幕右边开往左边。。。。。。安装 $ sudo apt-get install sl 运行 $ sl可以通过设置别名,给别人来个恶作剧,让ta敲ls就跑出个火车出来,不知道的肯定很有效果 O(∩_∩)O$alias ls=sl2. fortune 命令输出一句话,有笑话,名言什么的,中文版有唐诗宋词,
2013-12-27 21:49:55 2300 6
原创 socket通信函数的深入分析
平时我们可能会用 socket 通信做个作业交给老师,一般情况下,都是拷贝一段代码,ip 地址改下,端口号改下也就可以了,即使是会写 socket 通信程序,甚至是使用 socket 做一个文件传输的东西也不一定知晓 socket 通信函数的内部实现原理,这篇文章我就介绍下这些函数的内部实现: 1.socket 这个函数是通信的开端。当我们使用这个函数并指定了协议类型之后,这个
2013-12-26 17:11:24 2840 1
原创 string.h 的实现
最近很是烦躁,没做什么事,随便花了点时间把 C 库中的 string.h 中的几个函数实现了下,不多说了,直接贴代码吧,可能会存在错误和不好的算法,希望大家见谅: 测试函数写的乱七八糟,就不贴在这里了,有些函数是不需要实现差错控制的,使用不当,程序崩溃那是自己的事,我实现的这些个函数可能和经典的实现存在较大的差距,不过,我说过了,这仅仅是个人觉得好玩才随便写的,我也没那么多的时间去一一
2013-12-26 14:27:09 2314 1
转载 简单分析一下socket中的bind
在最开始接触bind的时候,只是在写基于tcp的server端的时候,知道在listen之前需要先bind一下,用来确保socket能在某个固定的端口监听。而bind的时候,函数参数中的端口填自己将要绑定的端口就行;而IP地址,需要填本机的IP,但是也可以用一个宏INADDR_ANY代替,用这个宏就可以不用查找本机的IP,它就可以代替本机的IP。当时只觉得这个INADDR_ANY比较神奇,但是由于
2013-12-22 11:08:19 3085
转载 GitHub详细教程
Table of Contents1 Git详细教程1.1 Git简介1.1.1 Git是何方神圣?1.1.2 重要的术语1.1.3 索引1.2 Git安装1.3 Git配置1.3.1 用户信息1.3.2 高亮显示1.3.3 忽略特定的文件1.3.4 使用.gitkeep来追踪空的文件夹1.4 开始操作Git1.4.1 创建内容1.4.2 创建仓库、添加文件和提交更改1.4.3 diff命令与co
2013-12-20 16:55:16 2252
转载 ioctl()函数详解
我这里说的ioctl函数是指驱动程序里的,因为我不知道还有没有别的场合用到了它,所以就规定了我们讨论的范围。写这篇文章是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑。一、 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下
2013-12-03 08:17:41 2902
转载 UNIX下C语言的图形编程-curses.h函数库
相信您在网路上一定用过如 tin,elm 等工具, 这些软体有项共同的特色, 即他们能利用上下左右等方向键来控制游标的位置. 除此之外, 这些程式 的画面也较为美观. 对 Programming 有兴趣的朋友一定对此感到好奇, 也 许他能在 PC 上用 TurboC 轻易地写出类似的程式, 然而, 但当他将相同 的程式一字不变地移到工作站上来编译时, 却出现一堆抓也抓不完的错误. 其实, 原因很简
2013-12-01 20:40:47 4003 1
原创 Linux命令的实现 -- ls pwd cd
其实这些命令的实现都是 C 语言提供的一些库函数,我们只需要使用这些函数,并对得到的结果进行相应的格式化即可,好的,我们开始吧:ls 用到的函数是 opendir ,readdir,这些都是读目录的函数,读取目录中的内容之后 ,我们可以对它进行解析,它是一条一条的读的,所以,我们可以得到全部的文件。pwd 用到的函数是 getcwd ,这个函数的意思是 get current working di
2013-12-01 10:45:12 6643 4
原创 popen函数
我们平时写程序和用终端输入命令的时候,常常会用到管道,比如,在一段程序中,你可能会这样写 int fd[2]; pipe(fd) 这时,我们就创建了一个管道,实现了进程之间的通信。 再比如,我们用终端的时候,我们可能会这样输入命令: ls -la | grep test 我们也是在两个命令之间创建了一个管道。 这篇文章介绍一个函数,用来创建管道的
2013-11-28 10:53:21 2128
转载 FTP两种连接模式
FTP是有两种传输的模式的,主动模式和被动模式,之前一直没怎么去搞明白之,现在找了下资料, 重新整理了下:一个完整的FTP文件传输需要建立两种类型的连接,一种为文件传输下命令,称为控制连接,另一种实现真正的文件传输,称为数据连接。1. 控制连接客户端希望与FTP服务器建立上传下载的数据传输时,它首先向服务器的TCP 21端口发起一个建立连接的请求,FTP服务器接受来自客户端的请求,完成连接的建立过
2013-11-27 16:29:14 13822
python 进程池失效原因
2015-09-02
怎样实现数据的动态采样
2014-05-21
TA创建的收藏夹 TA关注的收藏夹
TA关注的人