
算法
文章平均质量分 65
drunkcello
南七技校一码农...
展开
-
提取出某日访问百度次数最多的那个IP
题目描述: 假设一天之内某个IP访问百度的次数不超过40亿次,则访问次数可以用unsigned表示.用数组统计出每个IP地址出现的次数, 即可得到访问次数最大的IP地址。 方法: 计数法 IP地址是32位的二进制数,所以共有N=2^32=4G个不同的IP地址, 创建一个unsigned count[N];的数组,即可统计出每个IP的访问次数,而si原创 2013-04-23 18:53:23 · 767 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
题目:在二元树中找出和为某一值的所有路径 输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如输入整数22 和如下二元树 10 / \ 5 12 / \ 4 7 则打印出两条路径:10, 12 和10, 5, 7。 思路原创 2013-05-23 10:45:07 · 745 阅读 · 0 评论 -
设计包含min函数的栈
要求 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。 要求函数min、push 以及pop 的时间复杂度都是O(1)。 解法1: 使用一个辅助栈来保存最小元素,这个解法简单不失优雅。设该辅助栈名字为minimum stack,其栈顶元素为当前栈中的最小元素。这意味着 要获取当前栈中最小元素,只需要返回minimum stack的栈顶元原创 2013-05-21 17:55:56 · 846 阅读 · 0 评论 -
查找数组中超过出现次数超过一半的数字(找发帖水王)
题目 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 解决方案: 1.如果无序,那么我们是不是可以先把数组中所有这些数字先进行排序,至于选取什么排序方法则不在话下,最常用的快速排序O(N*logN)即可。排完序呢,直接遍历。在遍历整个数组的同时统计每个数字的出现次数,然后把那个出现次数超过一半的数字直接输出,题目便解答完成了。总的时间复杂度为O(N*logN+N)。我们发现原创 2013-05-02 09:37:30 · 1041 阅读 · 0 评论 -
一致性hash算法
tencent2012笔试题附加题 问题描述: 例如手机朋友网有n个服务器,为了方便用户的访问会在服务器上缓存数据,因此用户每次访问的时候最好能保持同一台服务器。 已有的做法是根据ServerIPIndex[QQNUM%n]得到请求的服务器,这种方法很方便将用户分到不同的服务器上去。但是如果一台服务器死掉了,那么n就变为了n-1,那么ServerIPIndex[QQNUM%n]与Se转载 2013-04-25 15:57:18 · 826 阅读 · 0 评论 -
深入理解递归:全排列问题
1.题目: 输入一个字符串,打印出该字符串中字符的所有排列。 例如输入字符串abc,则输出由字符a、b、c 所能排列出来的所有字符串 abc、acb、bac、bca、cab 和cba。 解决办法: 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列。以对字符串abc进行全排列为例,我们可以这么做:以abc为例 固定a原创 2013-04-25 12:06:00 · 2019 阅读 · 0 评论 -
Manacher算法: O(n)时间求字符串的最长回文子串
回文串包括奇数长的和偶数长的,一般求的时候都要分情况讨论,这个算法做了个简单的处理把奇偶情况统一了。算法的基本思路是这样的,把原串每个字符中间用一个串中没出现过的字符分隔开来(统一奇偶),用一个数组p[ i ]记录以 str[ i ] 为中间字符的回文串向右能匹配的长度。先看个例子 原串:w a a b w s w f d 新串: # w #原创 2013-04-24 18:57:36 · 997 阅读 · 0 评论 -
求连续子数组的最大和
题目描述: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。 #include using namespace st原创 2013-04-23 12:51:43 · 621 阅读 · 0 评论 -
前缀,中缀,后缀表达式
前缀表达式(Prefix Notation)是指将运算符写在前面操作数写在后面的不包含括号的表达式,而且为了纪念其发明者波兰数学家Jan Lukasiewicz所以前缀表达式也叫做“波兰表达式”。比如- 1 + 2 3 后缀表达式(Postfix Notation)与之相反,是指运算符写在操作数后面的不含括号的算术表达式,也叫做逆波兰表达式。比如1 2 3 + - 中缀表达式(Infi转载 2013-04-23 12:49:16 · 1268 阅读 · 0 评论 -
寻找亲和数(使用伴随数组)
题目描述: 求500万以内的所有亲和数 如果两个数a和b,a的所有真因数之和等于b,b的所有真因数之和等于a,则称a,b是一对亲和数。 例如220和284,1184和1210,2620和2924。 解决方案: 使用伴随数组。 假设是求10以内的亲和数,求解步骤如下: 因为所有数的真因数都包含1,所以,先在各个数的下方全部置1 然后取i原创 2013-04-23 12:45:54 · 2297 阅读 · 0 评论 -
C++快速生成随机数
http://blog.youkuaiyun.com/ajioy/article/details/7551687原创 2013-04-23 12:43:11 · 846 阅读 · 0 评论 -
两个字符串是否包含问题
题目描述: 假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法是讲,什么方法能最快的查出所有小字符串里的字母在大字符串里都有? 比如,如果是下面两个字符串: String 1: ABCDEFGHLMNOPQRS String 2: DCGSRQPOM 答案是true,所有在string2里的字母string1也都有。原创 2013-04-23 14:59:41 · 1026 阅读 · 0 评论 -
TOP K 和快速选择SELECT
TOP K 问题 题目描述:查找最小的k个元素 题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 解决方案: void maxHeap(int s[], int i, int len) { int largeIndex = -1; int left = 2 * i; int rig原创 2013-04-23 12:55:20 · 1152 阅读 · 0 评论 -
链表相交(及相交的节点)、判断链表是否有环问题
链表相交问题 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。 解决方案: 1.先判断链表是否有环 2.没有环,两个链表都遍历到最后的节点,判断这连个节点是否相同。 3.有环,必定相交。 struct Node { int data; int Node *next; }; // if there is no cycle. int isJoinedS原创 2013-05-23 16:06:04 · 847 阅读 · 0 评论