数据结构与算法
文章平均质量分 67
yeepom
你否定我的现在,我决定我的未来。
展开
-
二分搜索方法
int binarySearch(int list[], int key, int low, int high){ int mid; while(low <= high) { int mid = (low + high)/2; if (key == list[mid]) return mid; else if(key < list[mid]) hi原创 2013-01-07 19:28:47 · 466 阅读 · 0 评论 -
有一个整数数组,请求出两两之差绝对值最小的值
1.可以快排,然后遍历一遍排完序后的数组。时间复杂度为O(NlogN+N)。2.先遍历一遍数组a[ ],找出最大值max和最小值min。然后以建立一个(max+min-1)大小的数组b[ ],再次遍历原始数组,b[a[i]-min]++,试图建立一种映射关系,降低时间复杂度。代码如下:#include //#include using namespace std;int findM原创 2013-04-05 16:11:58 · 2210 阅读 · 0 评论 -
大整数的加法问题
题目列表 > A + B时间限制: 1000ms 内存限制: 1024MB描述输入两个正整数A和B, 求A+B的值输入两个正整数A, B输出A+B的和对于小数据, 0 100样例输入2 3样例输出5代码:#include #include #inclu原创 2013-04-05 14:38:04 · 877 阅读 · 0 评论 -
编程之美-电话号码对应英语单词
题目: 对如非全键盘的手机上的数字,每个数字都对应一些字母,比如2对应ABC,3对应DEF.........,8对应TUV,9对应WXYZ,要求对一段数字,输出其代表的所有可能的字母组合,如5869,可能代表JTMW、JTMX................#include using namespace std;char c[10][10] = {"", "","原创 2013-03-22 18:53:35 · 894 阅读 · 0 评论 -
编程之美-计算字符串的相似度
Ref:http://www.cnblogs.com/yujunyong/articles/2004724.html许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程序。我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把“a”替换为“b”); 2.增加一个字符(如把“abdd”变为“aebdd”); 3.删原创 2013-03-23 13:22:09 · 742 阅读 · 0 评论 -
位操作符
一、传统的C方式位操作:1.基本操作: 使用一个unsigned int变量来作为位容器。2.操作符:| 按位或操作符:result=exp1|exp2;当exp1和exp2中对应位中至少有一个为1时,result中对应位为1,否则为0。& 按位与操作符::result=exp1&exp2;当exp1和exp2中对应位全为1时,result中对应位为1,否则为0。原创 2013-04-07 23:56:12 · 761 阅读 · 0 评论 -
动态规划之最长公共子序列
具体分析见算法导论,直接上代码了。#include using namespace std;int LCS_Length(string X, string Y, int** C, int XLen, int YLen){ int m = XLen, n = YLen; for (int i = 1; i <= m; i++) C[i][0] = 0; fo原创 2013-03-25 19:15:13 · 821 阅读 · 0 评论 -
时间复杂度为O(nlogn)的最长单调递增子序列
写一记,其中利用二分查找法,具体分析见编程之美。#include using namespace std;#define N 20int binarySearch(int src[], int des, int low, int high){ int i = low, j = high; while (low < high) { int mid = (lo原创 2013-03-25 19:54:19 · 1256 阅读 · 0 评论 -
动态规划之矩阵链乘法
Description给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 Input有N个矩阵连乘,用一行有n+1个数数组表示,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开. Output你的输出应该有C行,即每组测试数据的输出占一行,它是原创 2013-03-25 10:49:49 · 1158 阅读 · 0 评论 -
2013年第二届腾讯马拉松初赛第五题
Problem Description 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动!于是,结果显而易见… 但是没有什么能难倒高智商美女湫湫的,她决定另寻对策——吃没关系,咱吃进去再运动运动消耗掉不就好了? 湫湫在内心咆哮:“我真是天才啊~\(≧▽≦)/~” 可是,大家要知道,过年回家多忙啊——帮忙家里做大扫除,看电影,看小说,高中同学聚原创 2013-03-23 22:02:15 · 1325 阅读 · 0 评论 -
编程之美 子数组的最大乘积
#include #include using namespace std;int multiWithoutN(int *P, int length, int key){ int result = 1; bool first = true; //引入first变量进行key值的排除。 for (int i = 0; i < length; i++) {原创 2013-03-01 17:17:09 · 505 阅读 · 0 评论 -
贪心算法之活动选择问题
问题描述: 这是一个调度竞争共享资源的多个活动的问题,目标就是选出一个最大的互相兼容的活动集合。假定有一个n个活动的集合S={a1,a2,...,an},这些活动使用同一个资源,而这个资源在某一时刻只能供一个活动使用。每个活动ai都是有一个开始时间si和一个结束时间fi,其中0 =fj或sj>=fi,则ai和aj是兼容的。在活动选择问题中,我们希望选出一个最大兼容活动集。假定活动原创 2013-03-27 11:59:57 · 1325 阅读 · 0 评论 -
二叉搜索树的一些基本操作
#include #include using namespace std;typedef struct BiTNode{ int data; struct BiTNode *lchild, *rchild;} BiTNode, *BiTree;bool searchBST(BiTree T, int key, BiTree f, BiTree *p){原创 2013-04-10 21:23:10 · 738 阅读 · 0 评论 -
二叉查找树后继节点和前驱节点查找
二叉查找树按照二叉树进行组织。二叉查找树关键字的存储方式总是瞒住二叉查找树性质:设x为二查查找树种一个节点。如果y是x的左子树中的一个节点,那么key[x] >= key[y]。如果y是x的右子树的一个节点,那么key[x] 这样对二叉查找树进行中序遍历就可得到书中所有元素的一个非降序排列。查找某一个存在节点的前驱和后继。某一个节点x的后继就是大于key[x]的关键字中最小的那个节点,原创 2013-04-03 19:12:24 · 3017 阅读 · 1 评论 -
如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串),目前只针对字母
针对字母,建立一种映射。#include using namespace std;const int MAX = 58;int isBrotherStr(char* str1, char* str2){ if (!str1 && !str2) { return -1; } else if (!str1 || !str2) { return 0; } else原创 2013-04-03 11:04:22 · 985 阅读 · 0 评论 -
将字符串中的字符'*'移到串的前部分 的一个解法
2005年11月金山笔试题。编码完成下面的处理函数。函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)自己的算法分析:有两个指针q1和q2,从后向前遍历,q2始终指向*,q原创 2013-04-02 11:22:23 · 2501 阅读 · 1 评论 -
堆排序
首先简要的介绍一下堆排序。1.堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,成为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,成为小顶堆。2.堆排序算法的基本思想:将待排序的序列构成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与对数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就原创 2013-03-30 11:22:42 · 669 阅读 · 0 评论 -
单链中的归并排序和快速排序
1.先搞一个单链表的快速排序,不能靠交换value来进行排序。这是百度的一道电面题,当时答得不完整。说一下自己的思路:以表中的第一个结点为比较标准,进行分类,分成两个链表,第一个表中的value都比标准的value小,第二个表中的value都比标准的value要大,注意在分的过程中,要将两个链表切断。然后用递归的方法对两个子表进行排序。。。最后把整个表连接起来。下面给出代码,试了几个数据都可以原创 2013-03-29 22:19:21 · 881 阅读 · 0 评论 -
希尔排序
介绍一个概念,基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间,像{2,1,3,6,4,7,8,2,4,6}这样可以称为基本有序了。下面给出代码:#include using namespace std;void shellSort(int L[], int len){ int i, j; int increment = len; do原创 2013-03-30 10:16:41 · 600 阅读 · 0 评论 -
一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对,如abc和cba。
现在已经是深夜了,再写个博就睡~题目据说是百度的一道面试题,找了个网上的代码,自己跑了一遍。分析如下:文件的大小上限是10G,不可能在内存操作了。考虑设计一种hash使得如果两个字符串维相反串能得出相同的hash值,然后用该hash将文件中的字符串散列到不同的文件中,再在各文件中进行匹配。比如这样的hash函数对字符串上所有字符的ascii求和,因为长度在1K以内,因此范围在int之内原创 2013-04-01 00:29:59 · 2404 阅读 · 0 评论 -
用C语言实现函数void * memmove(void *dest,const void *src,size_t n)
由于可以把任何类型的指针赋给void类型的指针 这个函数主要是实现各种数据类型的拷贝。 用C语言实现函数void * memmove(void *dest,const void *src,size_t n)。 memmove函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。 考虑到内存可能重叠的情况,要在函数中避免有以下方式 但是这里有个制约要考虑清楚原创 2013-04-01 11:49:21 · 1912 阅读 · 0 评论 -
一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
首先汇总一下各种思路:1.最原始的做法,检测每一个元素,看它左边的元素是不是小于等于它,右边的元素是不是大于等于它。但这样做时间复杂度会比较大为O(N^2)。2.第二种做法是对Array[ ]进行快排,得到B[ ],当Array[i]与B[i]相等时,就得到了我们想要的元素。3.可以用两个辅助数组,Max[i]和Min[i],Max是存储数组中下标从0到i的最大值,Min是存储数组中下原创 2013-03-31 20:36:02 · 1584 阅读 · 0 评论 -
搜索引擎面试题
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前一个日志文件中有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门),请你统计最热门的10个查询串,要求使用的内存不能超过1G。1000万条记录,每条记录最大为255Byte,那么日原创 2013-04-01 23:56:52 · 2299 阅读 · 0 评论 -
求最大连续递增数字串
求最大连续递增数字串(如―ads3sl456789DF3456ld345AA‖中的―456789‖)#include using namespace std;int getSubString(char src[], char rst[]){/* cout<<rst<<endl; cout<<"the length of the rst is : "<<sizeof(原创 2013-04-02 15:47:53 · 1445 阅读 · 0 评论 -
大整数的乘法问题
#include using namespace std;void multiple(char A[], char B[], char C[]){ int TMP, lenA = -1, lenB = -1; while (A[++lenA]!='\0') ; while (B[++lenB]!='\0') ; int Index, start = lenA+l原创 2013-04-02 18:24:03 · 746 阅读 · 0 评论 -
鸡蛋篮子算法题
题目:把N个鸡蛋放到M个篮子里,每个篮子不能为空,要求满足:任意给出一个不超过N的数量,都能找到其中某几个篮子的鸡蛋和等于它。请写一个程序,输入N,M,然后输出所有的鸡蛋放法。 题目解释:例如6个鸡蛋放3个篮子的一种可能为1,2,3,任意给出1该题目最早是我在网上看到一道600个鸡蛋放在10个篮子的放法,答案是给出了一个按2的乘积放的特例。我将其改编后用来招聘时考察工程师上机编程技原创 2013-04-03 15:50:06 · 2740 阅读 · 0 评论 -
不开辟用于交换数据的临时空间,如何完成字符串的逆序
不开辟用于交换数据的临时空间,如何完成字符串的逆序(在技术一轮面试中,有些面试官会这样问)#include using namespace std;void change(char* str){ for (int i = 0, j = strlen(str)-1; i < j; i++,j--) { str[i]=str[i]^str[j]; str[j]=str[i]^s原创 2013-04-02 20:55:20 · 1097 阅读 · 0 评论 -
编写一个程序,把一个有序整数数组放到二叉树中
分析:本题考察二叉搜索树的建树方法,简单的递归结构。 关于树的算法设计一定要联想到递归,因为树本身就是递归的定义。 而学会把递归改称非递归也是一种必要的技术。 毕竟,递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。 但是对某些数学问题,就一定要学会用递归去解决。#include using namespace std;struct student{原创 2013-04-02 19:05:22 · 1076 阅读 · 0 评论 -
Topk找出最大的K个数
使用了快速排序中的思想,期望时间复杂度为O(N)。#include using namespace std;void select(int* array, int k, int low, int high){ int i = low, j = high; int temp = array[i]; while (i < j) { while (array[j原创 2013-04-11 16:02:12 · 884 阅读 · 0 评论