![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
algorithm
cywosp
这个作者很懒,什么都没留下…
展开
-
经典考题——无重复字符问题(查找字符串中第一个无重复字符)
题目描述:寻求最佳的算法 编写一个高效率函数来找出一个字符串中第一个无重复字符.例如:”total”中的o,”teeter”中的r.要求算法效率优于O(n2)。分析:个人觉得,这个题目如果不强调效率就有点简单了吧,两层循环弄一下应该没问题了。但是另外一个角度,我觉转载 2011-09-02 15:33:44 · 2492 阅读 · 1 评论 -
单向链表中,如何在给定节点前快速插入一个节点?
对于单向链表来说,在某个节点后面插入一个新节点是非常快的。所以我们可以在给定节点后面插入一个新节点,然后交换给定节点和新节点的数据即可。转载 2011-08-27 14:11:49 · 4178 阅读 · 1 评论 -
海量日志数据,提取出某日访问百度次数最多的那个IP。
IP地址最多有2^32=4G种取值可能,所以不能完全加载到内存中。 可以考虑分而治之的策略,按照IP地址的hash(IP)%1024值,将海量日志存储到1024个小文件中。每个小文件最多包含4M个IP地址。 对于每个小文件,可以构建一个IP作为key,出现次数作为valu转载 2011-08-27 14:19:55 · 1777 阅读 · 0 评论 -
数组与链表的区别?
数组与链表的区别?在数组中,元素在内存中连续存放。对于访问操作,由于元素类型相同,占用内存相同,所以可以通过数组的下标计算出元素所在的内存地址,便于快速访问。但对于插入或删除操作,需要移动大量元素,所以速度比较慢。在链表中,元素在内存中没有连续存放,而是通过元素中转载 2011-08-27 13:37:55 · 1275 阅读 · 0 评论 -
平面上画1999条直线,最多能将平面分成多少部分?
在一个平面上画1999条直线,最多能将这一平面划分成多少个部分?没有直线时有一个空间;(1)1条直线时,这条这些可以将这个空间分成两个;(1+1)2条直线时,第二条直线可以和第一条直线相交,这样第二条直线可以将两个空间分成四个;(1+1+2)....注意到画每转载 2011-08-27 13:38:42 · 5656 阅读 · 0 评论 -
求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。
求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。一天总共有 3600*24 = 86400秒。定义一个长度为86400的整数数组i转载 2011-08-27 13:53:45 · 4840 阅读 · 0 评论 -
找到两个单向链表的第一个公共节点
如果两个单向链表有公共节点,则两个链表会构成Y型结构,最后一个节点相同。我们可以从头开始遍历两个链表,找到最后一个节点的指针,设为p_a,p_b。同时记录下两个链表的长度len_a,len_b(假设len_a >= len_b)。如果p_a == p_b,则说明两个链转载 2011-08-27 14:14:19 · 1594 阅读 · 1 评论 -
找出1到10w中没有出现的两个数字
有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数?方法1:申请10w个bit的空间,每个bit代表一个数字是否出现过。开始时将这10w个bit都初始化为0,表示所有数字都没有出现过。然后依次读入已经打乱循序的数字,并将对应的bit设为1。转载 2011-08-27 14:18:16 · 2007 阅读 · 1 评论 -
从300万字符串中找到最热门的10条
象搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前10条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G。请描述思想,写出算法(c语言),空间和时间复杂度。答案: 300万个字符串最多(假设没有重复,都是最大长度)占用内存3M*1K转载 2011-08-27 14:23:01 · 2838 阅读 · 0 评论 -
1024! 末尾有多少个0?
1024! 末尾有多少个0?末尾0的个数取决于乘法中因子2和5的个数。显然乘法中因子2的个数大于5的个数,所以我们只需统计因子5的个数。是5的倍数的数有: 1024 / 5 = 204个是25的倍数的数有:1024 / 25 = 40个是125的倍数的数有转载 2011-08-29 16:05:59 · 7769 阅读 · 0 评论 -
两个有序链表(相邻元素可能相同)找出他们交集,并把结果放到另一链表中
两个有序链表(相邻元素可能相同),找出他们的交集,并把结果放到另一链表中,代码如下:typedef struct Node* pNode; struct Node{ int val; struct Node *next;};pNode merge(pNode head1, pNode head2){ pNode head = NULL; pNode原创 2012-02-18 00:25:27 · 4272 阅读 · 0 评论 -
HTTP中Put和Post的区别
解释HTTP中Get和Post。它们有什么区别,哪个使用时更加安全?Get和Post都是浏览器向网页服务器提交数据的方法。 Get把要提交的数据编码在url中,比如 http://hi.baidu.com/mianshiti?key1=value1&key2=转载 2011-08-27 13:28:44 · 4519 阅读 · 1 评论 -
如何有效合并两个文件:一个是1亿条的用户基本信息,另一个是用户每天看电影连续剧等的记录,5000万条。其中内存只有1G。
如何有效合并两个文件:一个是1亿条的用户基本信息,另一个是用户每天看电影连续剧等的记录,5000万条。其中内存只有1G。显然内存不能同时存下所有的数据,所以考虑分而治之的思想。假设1K Byte可以保存一个用户的基本信息和看电影记录。我们可以将基本信息和看电影记录转载 2011-08-27 13:45:05 · 4751 阅读 · 0 评论 -
memcpy 和 memmove 有什么区别?
memcpy 和 memmove 有什么区别?memcpy和memmove都是将源地址的若干个字符拷贝到目标地址。如果源地址和目标地址有重叠,则memcpy不能保证拷贝正确,但memmove可以保证拷贝正确。 例如:char src[20];// set转载 2011-08-27 13:34:46 · 1203 阅读 · 0 评论 -
找到链表的倒数第m个节点
方法1:首先遍历链表,统计链表的长度N。然后再次遍历链表,找到第N-m+1个节点,即为倒数第m个节点。方法2:使用两个指针,并使它们指向的节点相距m-1个。然后同时向前移动两个指针,当一个指针指最后一个节点时,第二个指针指向倒数第m个节点。两个方法转载 2011-08-27 13:15:38 · 762 阅读 · 0 评论 -
求最大公约数问题
最大公约数问题,也不是个很难的问题,如果知道思路就很容易了。对于最大公约数问题,最简单的思路应该算是直接循环从1开始用两个数对其做除法了,找出最大公约数。不过这思路太没技术含量了,效率也低,如果数字很大,还是很慢的。一般解决最大公约数问题的方法是:辗转相除法(欧几里德算法)。转载 2011-09-02 15:37:58 · 1378 阅读 · 0 评论 -
不使用中间变量交换变量a、b变量
这是一道经典题目,很基础,但是经常考。题目描述:不用任何变量交换a、b两个变量。分析:交换两个变量的问题在c语言入门书籍中都有所涉及。在讲解c语言的函数的时候老师都会告诉我们,实参和形参的问题,下面的函数是不能完成交换两个变量的:void swap(int a,i转载 2011-09-02 15:40:39 · 3812 阅读 · 0 评论 -
const的含义及实现机制
const的含义及实现机制,比如:const int i,是怎么做到i只可读的?const用来说明所定义的变量是只读的。这些在编译期间完成,编译器可能使用常数直接替换掉对此变量的引用。转载 2011-08-27 13:35:48 · 5725 阅读 · 1 评论 -
tcp三次握手的过程,accept发生在三次握手哪个阶段?
tcp三次握手的过程,accept发生在三次握手哪个阶段?第一次握手:客户端发送syn包(syn=j)到服务器。第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。第三次握手:客户端收到服务器的SYN+AC转载 2011-08-27 13:36:48 · 11874 阅读 · 2 评论 -
c++中引用和指针有什么不同?指针加上什么限制等于引用?
引用不是一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。引用一经确定就不能修改。指针是一个变量,需要在内存中分配空间,此空间中存储所指对象的地址。由于指针是一个普通变量,所以其值还可以通过重新赋值转载 2011-08-27 13:42:00 · 1921 阅读 · 1 评论 -
美丽的Hash
提到Hash,大家都会想到它的“快速存取”,在O(1)时间复杂度里就可以查找到目标元素,或者判断其是否存在,基于Hash我们有HashTable,HashMap等多种数据结构。Hash数据结构里的数据对外是杂乱无序的,我们无法得知其具体存储位置,也不知道各个存储元素位置之间的相互转载 2011-08-27 13:46:24 · 1380 阅读 · 0 评论 -
在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。
在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。不妨假设10G个整数是64bit的。2G内存可以存放256M个64bit整数。我们可以将64bit的整数空间平均分成256M个取值范围,用2G的内存对每个取值范围内出现整数个数进行转载 2011-08-27 13:54:44 · 3078 阅读 · 0 评论 -
在100w个数中找最大的前100个数
应该使用某种数据结构保存迄今最大的100个数。每读到一个新数时,将新数和保存的100个数中的最小一个相比较,如果新数更大些,则替换。这样扫描一遍100w个数也就获得了最大的100个数。对于保存的100个数的数据结构,应该在最小复杂度的条件下满足1)可以获得最小的数;2转载 2011-08-27 14:03:32 · 2606 阅读 · 0 评论 -
有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?
拷贝pNext指针非常容易,所以题目的难点是如何拷贝pRand指针。假设原来链表为A1 -> A2 ->... -> An,新拷贝链表是B1 -> B2 ->...-> Bn。为了能够快速的找到pRand指向的节点,并把对应的关系拷贝到B中。我们可以将两个链表合并成A转载 2011-08-27 14:09:52 · 2782 阅读 · 1 评论 -
如何找出字典中的兄弟单词
给定一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给定一个字典,用户输入一个单词,如何根据字典找出这个单词有多少个兄弟单词?答案: 使用hash_map和链表。 首先定义一个key,使得兄弟单词有相同的key,不是转载 2011-08-27 14:20:49 · 2096 阅读 · 0 评论 -
从两个文件(各含50亿个url)中找出共同的url
给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?答案: 可以估计每个文件的大小为5G*64=300G,远大于4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 遍历文件a,对每转载 2011-08-27 14:21:30 · 2405 阅读 · 1 评论 -
每天进步一点点——求最大子序列和问题
假设有如下整数数组 -10 5 0 8 -1 10 -10 100 -1 求其最大的子序列和。从该数组我们可以知道其子序列和最大的序列为5 0 8 -1 10 -10 100且等于112。(为方便起见,如果数组全是负数则最大和为0)原创 2014-08-11 15:29:57 · 3378 阅读 · 0 评论