
经典算法
文章平均质量分 71
ysu108
这个作者很懒,什么都没留下…
展开
-
海量数据问题总结
这个是一系列问题,互联网公司,一些基本的功能都已经做的很完善了,海量数据处理成为重点的问题,也是面试笔试中常考的题目。主要参考http://blog.youkuaiyun.com/v_july_v/article/details/62794981.分而治之/hash映射 + hash统计 + 堆/快速/归并排序hash映射很重要,分类后的数据不会分散,某一个类别的数据会全部在一起。用hash_map统原创 2012-05-01 17:10:19 · 842 阅读 · 0 评论 -
树的镜像
淘宝笔试的一个题目,在网上也没有找到正确的代码,自己写了一个,简单测试了下还行,但不保证完全正确。题目是这样的,一棵树,不一定是二叉树,是一棵很普通的屌丝树,把他镜像反转下。思路必须明确,首先用左孩子右兄弟的存储方法存储这棵树,然后对所有同级别的兄弟反转,也就是所有节点的右边链反转,其实也就是单链表反转的操作。代码中用到了递归,但是要注意的一点是单链表反转while中操作的次数为链表的长度减一的,原创 2012-07-23 11:54:19 · 1109 阅读 · 0 评论 -
在从1到n的正数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。两种方法,一种从1到n一个个的计算,另外一种是用递归的方法。还有第三种方法是编程之美上给出面的,最简单但是很不好分析,这里就不介绍了。重点说下递归的方法,我们用一个稍微大一点的数字21345作为例子来分析。我们把从1到21345原创 2012-09-06 20:40:40 · 2947 阅读 · 0 评论 -
排序使得数组负数在正数左边且按照原来的顺序
假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求分别为:o(n),o(1)例如 -3 4 2 -1 7 3 -5 排序后 -3 -1 -5 4 2 7 3 采用整体冒泡的思想,先从后找到第一个负数,然后把这一个负数看成一个“元素”,再看这个负数前面是正数还是负数,如果是负数,原创 2012-10-04 16:26:02 · 3623 阅读 · 2 评论 -
求一个字符串中字符不重复的连续的子串
求一个字符串中字符不重复的连续的子串,例如abcabcda最长的一个字符没有重复的为abcd。采用动态规划法,把上一次出现不重复的结果放在一个整型数组里面a[128],这个数组里面存放的为每个字符出现的相对于字符串的偏移量,例如字符串abca,b的ascii为98,位置为1,则a[98] = 1;记录每个出现的字符偏移量,当出现重复字符的时候,计算当前的长度,如果大于maxLen更新长度,并记下起原创 2012-10-01 19:42:00 · 4433 阅读 · 1 评论 -
兑换零钱
#include #include using namespace std;//我们知道人民币有1、2、5、10、20、50、100这几种面值。//现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。//比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。void print_result(list resu原创 2012-10-01 20:44:57 · 1531 阅读 · 0 评论 -
简单链表操作
先是最简单的,创建,删除节点,有序链表添加节点,反转等,代码如下:#include using namespace std;struct Node{ int data; Node *next;};Node *createLink(int *a, int len){ Node *head = NULL;原创 2012-09-13 15:19:07 · 602 阅读 · 0 评论 -
判断一个数是不是四的幂次
知道的大概有三种算法1)直接算,首先看这个num可不可以被四整除,可以的话除四,不可以返回false,一直到最后看是不是等于1,这种方法对于每个数都是通用的。2)直接查找,其实也很快,一共32位,每次把1左移两位,一直移动15次就可以找到所以4的幂次了,感觉这样速度很快,只要15次运算。而且对于一半的数都通用,一般的数假如是3,那么就每次乘以三就好了。3)分析,如果是四的幂次,肯定是把原创 2012-10-03 09:28:44 · 1657 阅读 · 0 评论 -
查找攻击IP
这是百度的一道笔试题好像是08年的。给你1亿个ip地址和每个ip访问的时间(00:00:00=输入示例:(为了方便,只给出8个,意思意思)8 10 210.254.82.126 00:00:3910.85.124.135 00:00:4010.254.82.126 00:00:4410.254.82.126 00:00:4410.1.82.125 00:00:451原创 2012-10-02 11:24:46 · 2122 阅读 · 0 评论 -
寻找发帖水王问题总结
题目是这样描述的:“水王”发帖的数目超过了所有帖子的一半,有各个帖子的作者ID,求这个水王的ID编程之美给出了两种巧妙的解法解法一:ID排序,那么ID列表中的N/2项即为要找的ID(还要排序,时间复杂度为O(NlogN))解法二:通过查找,每次从列表中除去两个不一样的ID,最后就可以得出这个ID,时间复杂度O(N)。写法上也有技巧,不必非要找到一个不一样的在继续下去,如果下一个一样,那原创 2012-04-14 09:14:34 · 8507 阅读 · 2 评论 -
编程珠玑(一)位图
这个问题是编程之美中第一章开篇提到的问题,bitmap排序。大概意思是这样的,要对n个不重复的整数进行排序,每个数小于n(10的7次方)要求内存1M。其实是区号为800开始的电话号码,800不算在内。这个是典型的位图(bitmap,应该是位映射我觉得,估计是好翻译才把map翻译成图的)。下面是代码:#include using namespace std;const int NUM原创 2012-07-20 11:43:52 · 1886 阅读 · 0 评论 -
编程珠玑(四)求一个字符串中连续出现的次数最多的子串
这个题目不是编程珠玑上看到的,但是解法用到的数据结构在编程珠玑上有讲到,先归类到这里。求一个字符串中连续出现的次数最多的子串。例如字符串“abababc”,最多连续出现的为ab,连续出现三次。要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab。两个题目的解法有些类似,都用到了后缀数组这个数据结构。求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如原创 2012-07-27 22:11:40 · 16594 阅读 · 11 评论 -
编程珠玑(三)取样问题
要从0~n-1的整数中取出来m(m有几种算法,第一种算法是严格按照概率得到,满足每个数取得的概率相同。原理和抓阄时候一样,先取和后取得并没有概率上的差别,第一个数字0取得的概率为m/n,当rand()%n第二种算法和以前一篇的洗盘算法比较相似,但是并不是严格的每个数字取到的概率为m/n,算法是这样的,先生成一个n维的整数数组,a值为0~n-1,然后生成m个n内的随机整数rand,然后交换a原创 2012-07-24 21:50:03 · 1352 阅读 · 0 评论 -
编程珠玑(二)寻找一个字符串中最长重复字串
例如字符串"banana"中最长重复字串为ana,这里用到了一个很简单的数据结构字符串数组,其实为一个字符串指针数组,一个char *类型的数组,用字符地址代表每个字符,可以节省空间。算法很简单,求出每个后缀数组,然后对后缀数组进行排序,最后求出相邻的两个数组之间的最大公共字串。#include using namespace std;void common_str(char *s原创 2012-07-24 16:34:28 · 1183 阅读 · 0 评论 -
编程珠玑(二)字符串左旋
编程珠玑第二章的内容,有些内容没有看明白作者的意思。下面是向量左旋和变位词的问题。一、将一个n元向量左旋转i个位置。例如当N=8,i=3时,向量abcdefgh旋转为defghabc。这个题目编程之美也有2.17节数组的循环移位和3.1节字符串移位包含的问题。总结下,大概有5种解法,但是编程珠玑上有两种不是很明白,简单介绍下三种算法。第一种算法比较直接,可以写一个每次都向左移动一位,移原创 2012-07-20 19:20:16 · 1214 阅读 · 0 评论 -
判断二叉树是不是平衡的
输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树在遍历树的每个结点的时候,调用函数TreeDepth得到它的左右子树的深度。如果每个结点的左右子树的深度相差都不超过1,按照定义它就是一棵平衡的二叉树。#include using namespace std;typedef struct BTree原创 2012-08-25 16:21:46 · 799 阅读 · 0 评论 -
二叉树两个结点的最低共同父结点
输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。网上看来的题目,以下都有参考。求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。第一变种是二叉树是一种特殊的二叉树:查找二叉树。也就是树是排序过的,位于左子树上的结点都比父结点小,而位于右子树的结点都比父结点大。我们只需要从根结点开始和两个结点进行比较。如果当前结点的值比两个结点都大,则最低的共同父原创 2012-08-25 15:46:17 · 2382 阅读 · 0 评论 -
各种树的特点
简单总结下二叉查找树,红黑树,B树,B+树,B*树,AVL树,R树的特点关系与用处。首先他们都是查找树(search tree),支持多种动态集合的操作,search, minimum,maximum,predecessor,successor,insert,delete,既可以用作字典,也可以用作优先队列。一般而言,各种树的操作都与树的高度成正比。二叉查找树,一颗随机构造的二叉查找树的期原创 2012-05-05 11:02:24 · 9533 阅读 · 0 评论 -
trie树
A trie, or prefix tree, is an ordered tree data structure that is used to store an associative array where the keys are usually strings.The term trie comes from retrieval.(检索的意思)它有3个基本性质:1.根节点不包原创 2012-05-09 16:25:11 · 844 阅读 · 0 评论 -
图的小结
对于图这种数据结构,可以从五个维度来理解:表示方法,搜索算法,最小生成树,最短路径,最大流。一、表示方法邻接表和邻接矩阵通常采用邻接表(Adj)的方法,因为这种方法表示稀疏图(|E|远小于|V|2的图)比较紧凑,所需的存储空间为O(v+E),不足之处在于要确定某一边(u ,v)是否存在只能在顶点u的邻接表Adj[u]中来搜索v。二、搜索算法广度优先搜索和深度优先搜索广度优先原创 2012-05-14 21:21:25 · 1326 阅读 · 0 评论 -
字符串相关算法
一、概述字符串的处理几乎无处不在,算法的形式各种各样,各种巧妙的算法都有一个共同的特点-抓住问题的特点,一些智力题目也是,跟蜡烛相关的题很可能会用到蜡烛可以两头同时点燃,跟灯泡相关的,会用到灯开时间长了会发热等各种隐含的特点。推广到字符串,字符串有什么特点?1. 由固定数目的字符组成即使加上各种奇形怪状的符号,最大也不会超过256个。0~31及127(共33个)是控制字符或通信专用字符原创 2012-05-25 19:44:40 · 5383 阅读 · 2 评论 -
动态规划法和贪心算法
动态规划法和贪心算法csdn第一篇blog。先说说写文章的好处:第一,写文章是个学习的过程。写的过程中随着自己的思路的进行,会出现理解不清楚的地方,自然就会翻书或者google的搞明白。第二,写文章也可以锻炼自己的表达能力。用最简单语言描述一个问题,这个能力,我想无论什么工作都是很重要的。第三,写文章可以对问题的认识提升一个高度。通过写文章可以整理的自己的思路,引发自己的思考,原创 2012-04-13 21:28:51 · 3483 阅读 · 0 评论 -
二分查找引出的问题
看到http://blog.youkuaiyun.com/v_july_v/article/details/7093204上有这个问题,自己写了下,发现好多问题。这几天一直在想递归,感觉这个用递归貌似很好些。于是写出了这样的代码:int my_search1(int *a, int s, int e, int num){ if(s <= e) {原创 2012-07-12 17:00:03 · 581 阅读 · 0 评论 -
洗牌算法(shuffle)
搜了下,好多讨论,也有好多算法,但是可以确定的是没有最好的方法。还有计算机的伪随机的问题,应该找到一个种子也是唯一的,例如时间,但是如果服务器同时产生种子可能得到的时间也相同,还有就是CPU的温度,显卡的温度等作为种子,但是如果是一台服务器,同一时间可能也相同。其实可以考虑下别的条件,如果是真正的在线游戏的话,可以利用用户的UID来当作种子因为这个是现成的唯一的东西。下面是一种不错的方法,注意交换原创 2012-07-14 10:25:43 · 927 阅读 · 0 评论 -
基本排序算法总结
1.插入排序(insertion_sort)O(n2)对少量数据排序很有效,不需要额外的存储空间。待排序列已经是从小到大,最坏就是逆序的时候了。且是稳定的。#include #include int exchange(int *a, int i, int j);int insert(int *a, int s, int e);int main(int argc, c原创 2012-05-09 20:05:05 · 787 阅读 · 0 评论 -
大整数的乘法、加法、减法
乘法用经典的算法来解决,还有分治法来解决大整数乘法,但是效率提升不明显而且代码稍烦。所谓的经典算法就是直接按照位相乘,然后换算进位的算法,也很简单。加法和乘法用到的进位算法一样,减法是用借位。注意结果的位数,乘法、加法、减法结果的位是不同的。下面是代码#include using namespace std;void multiply(short *a, short *b, sho原创 2012-08-14 19:28:19 · 1996 阅读 · 0 评论 -
数组左边减去右边数值的最大差值
求数组左边减去右边数值的最大差值,如下面的数组,a[] = {5, 11, 3, 10, 6, 1, 8, 4, 3, 2};组大差值为11-1 为10;#include using namespace std;//求数组左边减去右边数值的最大差值,例如下面的数组,组大差值为11-1 为10,这个题目解法挺多,自己想到一个简单的算法,记录下//可以申请一个同样大小的数组b,从右原创 2012-09-01 21:47:13 · 3315 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
来自何海涛100题。题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / \原创 2012-08-23 15:35:15 · 738 阅读 · 0 评论 -
二叉树总结
分大概几个部分吧,定义(包括平衡、完全、满二叉树),基本性质、存储方式、遍历方法,树转成二叉树方法五个部分,最后是代码。一、定义wiki上定义:In computer science, a binary tree is a tree data structure in which each node has at most two child nodes, usually distingu原创 2012-06-24 16:23:14 · 1686 阅读 · 0 评论 -
排列和组合问题
回溯法是一种深度优先搜索空间树的算法,算法基本分成两个部分试探部分和回溯部分,试探部分当满足除规模外的全部条件时扩大规模,回溯部分回溯条件有两个,当问题不是合法解和求完一个解要求下一个解的时候都要回溯。典型问题就是求组合数的问题。一般的递归在调用完了自身之后不会有动作了,而回溯不同,他在调用完了自身还是有动作的,一般是个循环,在循环中有可能不停的调用自身。对于全排列问题,用递归算法相对比较简单原创 2012-05-09 20:07:57 · 715 阅读 · 0 评论 -
顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213原创 2012-08-26 15:17:44 · 1226 阅读 · 2 评论 -
输出1到最大的N位数
输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。这个题目主要考虑的是大整数越界的问题,下面采用了两种方法,一种是用数组模拟大整数相加,另一种是用递归的方法,递归的方法代码简单明了,但是就是效率比较低。下面是我在自己的linux虚拟机上跑出来的5位数所用的时间,即是输出1到99999,非递归的方法时间为:real 0m14.2原创 2012-08-26 16:45:09 · 1493 阅读 · 0 评论 -
CRC8校验
#include using namespace std;unsigned char CRC8(unsigned char crcPoly, unsigned char *crcData, int crcDataLen){ unsigned char crcResult = 0xFF; unsigned char crcTemp = 0x00; unsigned char *data原创 2013-07-04 19:34:39 · 6103 阅读 · 2 评论