![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
程序员面试
文章平均质量分 50
yxj_1989
这个作者很懒,什么都没留下…
展开
-
对程序员面试题目的重要总结
在面试题目中经常要让我们从一个数字序列中找出我们想要的一些信息,针对这样的题目,本人有如下重要总结,希望帮助大家: 1.如果要处理的数字序列是一个无序的数列,那么尽量往快速排序上靠,用快速排序的思想解决此类问题。 2.如果要处理的数字序列是一个有序的数列,那么尽量往二分查找上靠,用二分查找的思想解决此类问题。原创 2013-07-15 16:14:56 · 754 阅读 · 0 评论 -
对linux中多线程编程中pthread_join的理解
在Linux中,默认情况下是在一个线程被创建后,必须使用此函数对创建的线程进行资源回收,但是可以设置Threads attributes来设置当一个线程结束时,直接回收此线程所占用的系统资源,详细资料查看Threads attributes。 其实在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone()。该系统copy了一个和原先进程完全一样的进程,并在这个原创 2013-08-04 21:32:39 · 4415 阅读 · 0 评论 -
用位运算求一个数的绝对值
我们知道在我们对一个数进行位运算的时候,是在这个数的补码上进行的,对于补码我们知道,正数的补码是原码,负数的补码为原码除了最高位的符号位,取反,然后加1。把补码转换成原码的时候,正数还是原码,负数时把补码除了符号位取反然后加1(我们可以发现如果这时候连符号位也求反,然后加1,与以前不同的只是少了一个符号位,现在实际上就是这个数的绝对值)。所以我们可以得到对一个负数求绝对值的表达式为in原创 2013-08-04 16:40:24 · 5161 阅读 · 2 评论 -
等概率随机函数的实现 .
题目:已知随机函数rand(),以p的概率产生0,以1-p的概率产生1,现在要求设计一个新的随机函数newRand(), 使其以1/n的等概率产生1~n之间的任意一个数。解决思路:可以通过已知随机函数rand()产生等概率产生0和1的新随机函数Rand(),然后调用k(k为整数n的二进制表示的位数)次Rand()函数,得到一个长度为k的0和1序列,以此序列所形成的整数即为1--n之间的数字。注转载 2013-07-28 16:51:14 · 788 阅读 · 0 评论 -
assert()函数
assert() 宏用法注意:assert是宏,而不是函数。在C的assert.h头文件中。assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:12#include void assert( intexpression );assert的作用是先计算转载 2013-07-28 11:10:04 · 731 阅读 · 0 评论 -
复制构造函数应该注意的问题
拷贝构造函数必须以引用的形式传递(参数为引用值)。其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回原创 2013-08-03 20:58:44 · 1144 阅读 · 0 评论 -
判断两个链表是否相交
解题思路:首先分别判断两个链表是否存在环。 (1)如果两个链表都不存在环,则直接比较两个链表的表尾节点是否相等即可,如果相等,则相交,否则不想交。 (2)如果一个链表存在环,而另一个链表不存在环,则两个链表肯定不相交。 (3)如果两个链表都存在环。则如果两个链表相交的话则一个链表原创 2013-07-28 12:15:32 · 819 阅读 · 0 评论 -
随机数范围扩展方法总结 .
题目:已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。分析:要保证rand10()在整数1-10的均匀分布,可以构造一个1-10*n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1-10*n区间上的一个随机整数,那么x%10+1就是均匀分布在1-10区间上的整数。由于(rand7()-1)*7+rand7()可以构造转载 2013-07-28 16:28:36 · 868 阅读 · 0 评论 -
二分查找的感悟
今天在看v_JULY_v写的二分查找实现(Jon Bentley:90%程序员无法正确实现)一文,感悟颇深,在看文章之前自己心想二分查找不是相当的easy,但是真的在读完文章,然后和自己写的比较之后,返现我就是那90%中的一员,深深明白一个道理,看似再简单的问题,没有100%的细心和努力也不可能做好。现在就把原文中的代码展示出来,不知道是属于10%行列还是90%行列?代码来自:http://b原创 2013-08-05 22:19:20 · 1192 阅读 · 0 评论 -
用c++编写一个不能被继承的类(但是可以在类外部定义该类的对象)
据我们知道,我们只要把类的构造函数和析构函数定义为private类型,那么就不能够在外部建立给类的对象,也就不能以给类为基类进行继承,因为如果继承,建立对象的时候将要调用基类的构造函数,但是因为为private,所以派生类调用基类构造函数的时候,将会连接失败,这样达到不能被继承的任务,但是缺憾是我们不能够在类外部定义该类的对象。那么应该怎么解决呢?????下面给出代码templatecla原创 2013-08-06 17:19:47 · 1252 阅读 · 0 评论 -
Linux多线程编程的时候怎么查看一个进程中的某个线程是否存活
pthread_kill:别被名字吓到,pthread_kill可不是kill,而是向线程发送signal。还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数。int pthread_kill(pthread_t thread, int sig);向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默原创 2013-09-10 17:34:36 · 2021 阅读 · 0 评论 -
水库抽样问题
随机抽样问题表示如下:要求从N个元素中随机的抽取k个元素,其中N无法确定。这种应用的场景一般是数据流的情况下,由于数据只能被读取一次,而且数据量很大,并不能全部保存,因此数据量N是无法在抽样开始时确定的;但又要保持随机性,于是有了这个问题。所以搜索网站有时候会问这样的问题。这里的核心问题就是“随机”,怎么才能是随机的抽取元素呢?我们设想,买彩票的时候,由于所有彩票的中奖概率原创 2013-09-02 14:52:34 · 1716 阅读 · 0 评论 -
SQL Select语句完整的执行顺序
1、from子句组装来自不同数据源的数据;2、where子句基于指定的条件对记录行进行筛选;3、group by子句将数据划分为多个分组;4、使用聚集函数进行计算;5、使用having子句筛选分组;6、计算所有的表达式;7、使用order by对结果集进行排序原创 2013-08-29 22:29:17 · 1169 阅读 · 0 评论 -
海盗分硬币问题总结
传说,从前有五个海盗抢得了100枚金币.他们通过了一个如何确定选用谁的分配方案的安排.即:1.抽签决定各人的号码(1,2,3,4,5);2.先由1号提出分配方案,然后5个人表决.当且仅当超过半数人同意时,方案才算被通过,否则他将被扔入大海喂鲨鱼;3.当1号死后,再由2号提方案,4个人表决,当且仅当超过半数同意时,方案才算通过,否则2号同样将被扔入大海喂鲨鱼;4.往下依次类推原创 2013-08-17 11:19:24 · 3873 阅读 · 0 评论 -
12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球(13个呢?)
1,天平一边放四个,平则坏球在余下的四个里,好办(同方法二中的相等处理)。 不平,先将偏重的四个编号为:1、2、3、4。偏轻的编为A、B、C、D(因为不知道轻重)。2。天平一边放三个,比如:左边放1、2、A。右边放3、4、B。 平则坏球是C、D 里偏轻的,不平则根据轻重淘汰1、2、B或 3、4、A。假设是12A>34B,那么一定是12中有一个偏重或者B偏轻,最后一次把12B相称即可,假设称原创 2013-08-14 22:50:08 · 1408 阅读 · 0 评论 -
B-树和B+树的应用:数据搜索和数据库索引
B-树1 .B-树定义B-树是一种平衡的多路查找树,它在文件系统中很有用。定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树;⑵若根结点不是叶子结点,则至少有两棵子树;⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树;⑷所有的非终端结点中包含以下信息数据: (n,A0,K1,A1,K2,…,Kn,An转载 2013-08-13 16:31:11 · 862 阅读 · 0 评论 -
在遇到可以用递归解决的问题,但是又不让用递归怎么办
我们知道,用递归方法可以快速,简洁地解决一些问题,但是他的空间开销也比较大,我们习惯于用递归解决各种问题,但是在一些应用场景下要求我们不能使用递归,我们发现这时候举手无措,这时候怎么办呢???记住这时候不用慌张,我们知道,递归的深入过程实际上是逐步入栈的时候,回溯的时候是出栈的时候,在我们知道这个道理的情况下,我们只要自己建立一个栈,然后在栈中模拟函数的调用过程,不是就可以达到目的了。所以在不让用原创 2013-08-10 21:16:13 · 1699 阅读 · 0 评论 -
memmove源码实现
函数原型: void *memmove(void *dest, const void *src, unsigned int count)参数说明:dest为目的字符串,src为源字符串,count为要拷贝的字节数。所在库名:#include 函数功能:将字符串src中的前n个字节拷贝到dest中。返回说明:dest和src所指内存区域可以重叠,但复制后src内容会被更改。函数返回指转载 2013-08-08 22:43:01 · 1637 阅读 · 0 评论 -
找出有环链表中环的起点
问题: 给定一个有环的链表,写一个算法,找出环的起点。例如:输入:A->B->C->D->E->C[与前面的C是同一个节点]输出:C判断一个链表是否存在环有一个简单的方法,就是使用一个快指针、和一个慢指针,快指针每次走两步,慢指针每次走一步,则如果有环,它们最后必然会相遇的。本题的难点在于要找出环的起点。其实也不难,与判断是否有环类似,用两个步长分别为1和转载 2013-07-28 12:11:37 · 892 阅读 · 0 评论 -
linux网络编程中的pol和epolll函数总结
poll()函数:这个函数是某些Unix系统提供的用于执行与select()函数同等功能的函数,下面是这个函数的声明: #include int poll(struct pollfd fds[], nfds_t nfds, int timeout);参数说明:fds:是一个struct pollfd结构类型的数组,用于存放需要检测其状态的Socket描述符原创 2013-07-28 10:29:54 · 1337 阅读 · 0 评论 -
自己写的atoi函数和itoa函数
atoi函数的实现源码:#include using namespace std;enum status{invalid=0,valid};bool result_status=invalid;//最后最为输入是否违法的标识int strToInt(const char* str){ long long num=0; bool minus=false; i原创 2013-07-30 15:49:35 · 1619 阅读 · 0 评论 -
placement new
1. placement new的含义placement new 是重载operator new 的一个标准、全局的版本,它不能够被自定义的版本代替(不像普通版本的operator new 和 operator delete能够被替换)。void *operator new( size_t, void *p ) throw() { return p; }placemen转载 2013-07-30 19:02:09 · 801 阅读 · 0 评论 -
linux文件系统的理解(1)
磁盘在使用之前需要格式化,格式化是在磁盘中建立文件系统,他们将确定文件的存储方式和索引方法,确定磁盘空间分配和回收方法。 在linux系统中文件系统的存储有三级组鞥,其中目录存储了文件的层次结构,数据块存储了文件的具体信息,i节点是连接文件层次结构和数据结构之间的桥梁。 文件系统通过i节点对文件进行控制和管理,通过i节点我们就能找到对应文件的数据块,其中每个文件对应一个i节点原创 2013-07-29 21:23:08 · 940 阅读 · 0 评论 -
静态链接与动态链接
静态链接是由连接器在链接时将库的内容加入到可执行程序中的做法,全部内容都放到同一个可执行文件中。 静态链接使得不同的程序开发者和部门能够相对独立地开发和测试自己的程序模块,从某种意义上来讲大大促进了程序的开发效率,原先限制程序的规模也随之扩大。但是慢慢地静态链接的诸多缺点也逐步暴露出来,比如浪费内存和磁盘空间、模块更新困难等问题 静态链接的最大缺点是生成的可执行文件太大原创 2013-07-29 20:59:10 · 871 阅读 · 0 评论 -
读stl源码之后对list容器的一点感想
list容器是以链表的方式实现的,并且是一个循环链表,也就是通过任何一个节点可以遍历完全list。 链表的节点由三部分组成为一个next指针指向下一个节点(当做++操作的时候,直接可以通过next就可以到达下一个节点),prev指针指向前一个节点(当做--的时候直接可以通过prev到达前一个节点),data包括节点中的数据。 同时要注意到的一点,在对迭代器iter做inser原创 2013-07-20 16:44:20 · 1047 阅读 · 0 评论 -
结合数据挖掘分类谈谈对信息熵的理解
信息是个很抽象的概念。人们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少。比如一本五十万字的中文书到底有多少信息量。直到1948年,香农提出了“信息熵”的概念,才解决了对信息的量化度量问题。 公式为:H(x)=E[I(xi)]=E[ log(2,1/p(xi)) ]=-∑p(xi)log(2,p(xi)) (i=1,2,..n)该值越大表示信息量越大 在一个系统中,该系原创 2013-07-19 16:58:57 · 4633 阅读 · 0 评论 -
linux编程中对死锁的一点感想
死锁是由于一系列线程竞争一些列资源产生的永久阻塞。导致死锁的有两种情况: 1.自死锁(往往被忽略) 一个线程在拥有某个资源的情况下又试图申请对该资源的使用,陷入到自死锁。 2.另外一种情况是线程1用于资源A,线程2拥有资源B,这时候线程1申请资源B,线程2申请资源A,陷入了相互等待的境地,造成死锁。原创 2013-07-17 22:18:42 · 781 阅读 · 0 评论 -
对map和hash_map的一点总结
map内部实现是依据红黑树的,查询的时间复杂度为log(n)。hash_map的内部实现是哈希表,查询的时间复杂度为n(1)。hash可以看成用空间复杂度换取了时间复杂度。 在hash_map中,每个key都对应于一个桶,用来容纳value值。为了实现hash_map,我们需要定义哈希函数和等于比较函数。在没有提供这些函数的时候会用一个缺省的。 有很重要的一点是hash_map需原创 2013-07-15 19:42:27 · 776 阅读 · 0 评论 -
在网络编程的时候使用非阻塞的connect
对于面向连接的socket类型(SOCK_STREAM,SOCK_SEQPACKET)在读写数据之前必须建立连接,首先服务器端socket必须在一个客户端知道的地址进行监听,也就是创建socket之后必须调用bind绑定到一个指定的地址,然后调用int listen(int sockfd, int backlog);进行监听。此时服务器socket允许客户端进行连接,backlog提示没被ac转载 2013-07-23 17:31:22 · 1991 阅读 · 0 评论 -
关于tcp协议断开连接以及在socket编程时候连接的一些理解
要释放一个TCP连接,需要通过四次握手过程,这是由TCP的半关闭特性造成的,因为TCP连接时全双工的,因此,需要TCP两端要单独执行关闭。值得注意的是,主动关闭的一端在发送FIN之后,依然还能正常接收对方的数据,只是通知对方它已经没有数据需要发送了,同理,被动关闭的一端在收到FIN之后,仍然可以发送数据,直到它自身同样发出FIN之后,才停止发送数据。 TCP连接的超时问题:原创 2013-07-23 17:57:20 · 1549 阅读 · 0 评论 -
数据挖掘中的划分聚类简介(k均值和k中心点)
k均值方法介绍: 从中任意选择k个对象作为簇的中心 repeat 根据均值,将每个对象划分到最相似的簇 更新簇均值,计算每个簇对象的均值 until 不再发生变化 存在的缺点; 1.只有簇有均值定义的时候才能使用 2.不适合发现凸形状的簇,或者大小相差很大的簇,适合发掘圆形簇翻译 2013-07-26 19:36:15 · 2411 阅读 · 0 评论 -
不用循环,递归,if,switch语句编写从1+2+.....n的结果的程序
在类中声明静态变量,在类外初始化的时候,不用再次加static关键字,否则报错 在类中声明静态函数,类外定义的时候,函数前面也不要加static关键字原创 2013-07-26 19:57:48 · 1070 阅读 · 0 评论 -
信号量的使用步骤
信号量的使用如下步骤小结1.声明信号量sem_t sem1;2.初始化信号量sem_init(&sem1,0,1);3.sem_post和sem_wait函数配合使用来达到线程同步4.释放信号量int sem_destroy (sem_t *sem1);原创 2013-08-01 21:34:13 · 1607 阅读 · 0 评论 -
gcc/g++基本命令简介
gcc & g++现在是gnu中最主要和最流行的c & c++编译器 。g++是c++的命令,以.cpp为主,对于c语言后缀名一般为.c。这时候命令换做gcc即可。其实是无关紧要的。其实编译器是根据gcc还是g++来确定是按照C标准还是C++标准编译链接。下面以Test.cpp为例:命令: g++ Test.cpp功能:生成默认为a.exe的文件,这个过程包含了编译转载 2013-07-29 20:06:56 · 898 阅读 · 0 评论 -
strcpy函数和mencpy函数的解释和区别分析
strcpy和memcpy的区别strcpy和memcpy都是标准C库函数,它们有下面的特点。strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制。即memcpy对转载 2013-07-30 16:59:15 · 2028 阅读 · 0 评论 -
父进程和子进程关于数据和文件描述符的继承的理解
用fork()函数建立的子进程几乎与父进程完全一样,子进程中的所有变量均保持他们在父进程中的值(当然fork的返回值除外),因为自己称可用的数据是父进程可用数据的拷贝,并且其占用不同的内存地址空间(当然逻辑地址可能是一样的),这就保证了在一个进程中的变量数据变化不会影响到另外一个进程。这一点非常重要。 但是有一点要特别注意的,在父进程打开的文件,那么在子进程中也会打开,继承了打开的文件描原创 2013-08-01 17:30:00 · 4867 阅读 · 0 评论 -
#define和printf都不是C语句
语言的语句用来向计算机系统发出操作指令。一个语句经编译后产生若干条机器指令。C语句都是用来完成一定操作任务的。Printf是C语句#define只是一个宏,在预处理是用,不是语句原创 2013-07-30 19:07:29 · 10678 阅读 · 0 评论 -
读stl源码解析的感悟(2)
在stl实现的过程中allocate()函数负责内存的分配(注意只是分配内存,并不对内存做初始化操作)deallocate()函数用来释放内存。 内存配置好后的对象构造使用construct()函数实现的,对象的析构使用destroy()函数实现的。一般释放的过程为:先用destroy()函数析构对象 然后用deallocate()函数释放内存。原创 2013-07-23 21:40:14 · 718 阅读 · 0 评论 -
如何高效地实现查询在一个表而不在另一个表中的记录
面试的时候被考官问到这个问题,不佳思索就想出来一个可以解决这个问题的方法,我说用not in就可以实现,也就是这样: select A.* from tbl1 A where A.key not in (select key from tbl2) 然后考官又问,还有没有其他的方法,我说也可以用not exists,然后又问还有吗,我实在也原创 2013-09-17 11:57:43 · 1224 阅读 · 0 评论