算法学习
文章平均质量分 57
hiphopmattshi
这个作者很懒,什么都没留下…
展开
-
数组中逆序对统计方法
首先阐述一下逆序对的概念。假设有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当ia[j],那么我们就称(a[i],a[j])为一个逆序对。 那么统计一个数组中的逆序对,有什么作用呢。逆序对可以反映插入排序的效率问题,如果逆序对数量多,那么插入排序的效率就低,反之亦然。 那么如何快速的找到逆序对的数量,同时又能够对数组进行排序,并且使得复杂度为O(n*l原创 2012-03-03 19:04:28 · 4625 阅读 · 0 评论 -
笔试题1--猫吃老鼠问题
题目: 有N个老鼠,排成一队,按顺序,1,2....N 。一只猫从任意位置开始吃,每隔一个吃一个,循环吃。例如: 老鼠有1,2,3,4,5,6,7个,从第二个开始吃,则吃的顺序为:2,4,6,1,5,3,7思路: 从某一个位置first开始吃的话,间隔一个在next处继续吃。那么这道题关键是要找到下一个开始吃的位置在哪里。 可能遇到的情况,fi原创 2012-03-29 22:21:31 · 2477 阅读 · 0 评论 -
A*算法求解8数码问题
困扰我多日的八数码问题终于解决了,一度对八数码问题不知道该如何下手,网上很多都是用A*算法解的,但是版本可以说各有千秋,自己一时间看看各个版本的代码,也弄的头昏脑涨的,这两天一直研究A*算法,然后想通过一个实例来好好学习下A*问题,这样如果能够很好的解决典型的8数码问题,对自己也有个很好的提升。在网上看到的版本大部分都是c++的,然后我想自己就通过java来实现,毕竟用java来实现算法要容易的多原创 2012-05-05 19:12:06 · 14303 阅读 · 1 评论 -
霍夫曼编码的多种实现
霍夫曼编码曾在数据结构,算法,系统结构等多门课程出现过,可见该编码是一个很重要的技术。我在一个开源的文件压缩软件中了解到了该软件的一些实现。同时也做些算法试题,对于霍夫曼编码不同的实现方式,差异极大。 我想从以下几个方面阐述霍夫曼编码 1 数据结构中实现霍夫曼编码 2 利用堆排序实现霍夫曼编码1 数据结构中实现霍夫曼的方法比较简单 关键的是数据结构的定原创 2012-06-04 13:06:17 · 2449 阅读 · 0 评论 -
N个字符串的最大公共子串 (暴力解法)
求两个字符串的最大公共子串,可以通过动态规划,很容易解决。但是遇到n个字符串的最大公共子串,就比较复杂了,网上都说需要通过后缀数组来解决,这个方法还在研究中,我先用暴力解法来跑跑,看看运行效率如何。这里解决过程中容易产生一种错误的解题思路,即我之前想的一些想法就是先求两个字符串的最大公共子串,然后利用该公共子串和其他的字符串进行对比,求解他们之间的最大公共子串。但这是就出现了一个严原创 2012-06-10 19:47:59 · 2412 阅读 · 2 评论 -
出栈序列问题归纳
最近温习数据结构方面的一些知识,遇到了很多关于出栈序列的问题。 大致就是已知元素的入栈序列,然后求出出栈序列。比如入栈为1,2,3,...n,然后求出可能的出栈序列数目,以及判断是否为正确的出栈序列。 下面就是我遇到的两个问题:描述 宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n,栈A的深度大于n。现在可以进行两种操作: 1.将一个数,从操作数序列的头原创 2012-06-23 22:33:38 · 7795 阅读 · 2 评论 -
窗口(超级版)
有一串整数在排队……有N个整数,你有一个可以框住M个连续段整数的木框,现在你想知道,对于这个队列中任意的连续M个整数,最大和最小的整数是哪个?例:(M大小的窗口向右滑动)1 2 3 2 1 M=21 2 MAX 2 MIN 12 3 MAX 3 MIN 23 2 MAX 3 MIN 22 1 MAX 2 MIN 1最后需要输出的是原创 2012-07-28 23:26:28 · 466 阅读 · 0 评论 -
面试训练数对之差最大值
题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。思路分析:数组需要求出左边的最大值,和右边的最小值,那么数对之差就为左边最大值减去右边最小值可以将数组划分,那么数对之差最大值 可能有三种情况1 左边数组数对之差 2 右边数组数对之差原创 2012-08-29 22:03:06 · 678 阅读 · 0 评论 -
面试训练判断二叉树是不是平衡
题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树:思路:每一个节点计算depth,后序遍历来判断,采用二叉排序树建树练习点:二叉排序树建立 二叉排序树遍历,深度求解 平衡二叉树定义原创 2012-08-29 22:51:41 · 635 阅读 · 0 评论 -
发个码农的求职总结
工作基本确定了,牛公司都转了一圈,做个简单总结,造福学弟学妹:google:很难的算法题,概率题,智力题。不搞ACM的很难拿到google offer。当然也有牛人不搞ACM的拿到offer。微软:纯coding,但是对coding要求非常高。例如实现double pow(double a, int n),能写到微软要求的人不多的。并且微软是连续五轮纯英文,压力还是有点大的。百度:算法转载 2012-08-30 21:34:00 · 755 阅读 · 0 评论 -
面试训练字符串的组合
题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。开始我的思路 是递归,但是具体如何作,没想出来。后面看涛哥日志中一个网友回复,将字符串看成01组成数字串,为1则有字母,这样就是判断从1到2^n的数字里面哪些位为1,则对应为字符串代码简单:#include "stdio.h"#include原创 2012-08-30 23:35:36 · 763 阅读 · 0 评论 -
面试训练八皇后问题
题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。原创 2012-08-31 14:06:57 · 832 阅读 · 0 评论 -
面试训练海涛53题
题目(六):运行下列C++代码,输出什么?struct Point3D{ int x; int y; int z;}; int _tmain(int argc, _TCHAR* argv[]){ Point3D* pPoint = NULL; int offset = (int)(&(原创 2012-09-01 14:11:58 · 660 阅读 · 0 评论 -
面试训练海涛56题
问题(16):运行如下的C++代码,输出是什么?class A{public: virtual void Fun(int number = 10) { std::cout << "A::Fun with number " << number; }}; class B: public A{public: vir原创 2012-08-31 18:54:37 · 1460 阅读 · 0 评论 -
面试训练O(n)时间的排序
题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。思路:归并,快排,插入,等排序最快为o(nlgn)的时间复杂度 要达到o(n)的时间复杂度 只有计数排序,桶排序,基数排序法才能达到考虑到公司员工入职和离职的年龄范围是固定的都是介于 1-100之间的数,所以可以通过计数排序来解决问题那原创 2012-08-31 15:24:30 · 2293 阅读 · 0 评论 -
面试训练不用+、-、×、÷做加法
题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。思路:简化版的话,我认为只有正整数的话,那么直接可以用大数加法的原理来解决这个问题,整体思路就是考虑进位,同时作为2进制进行加法运算 但是实现比较复杂,考虑问题比较麻烦,时间耽误比较多半个小时才写出来,坑爹啊#include "stdio.h"int count(int numA,int numB)原创 2012-08-31 21:19:21 · 744 阅读 · 2 评论 -
面试训练海涛54题
运行下图中的C++代码,输出是什么?#include class A{private: int n1; int n2;public: A(): n2(0), n1(n2 + 2) { } void Print() {原创 2012-08-31 21:46:39 · 790 阅读 · 0 评论 -
c笔试汇总1
#include "stdio.h"int main(){ char *str = "AAA"; printf("%s",str); str[0]='B'; printf("%s",str);return;}这段代码有什么问题?str指向字符串常量,str[0]='B'对字符串常量进行赋值,当然会出现错误。题目2int (*a[10])(int)为一个函数指针原创 2012-09-01 18:30:51 · 528 阅读 · 0 评论 -
c语言常见问题汇总
const 在*左边 表示指针指向的变量不可变const在*右边 表示该指针本身是不可变的(4) 下面描述中,符合结构化程序设计风格的是(A)A. 使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑 B. 模块只有一个入口,可以有多个出口 C. 注重提高程序的执行效率 D. 不使用goto语句(6) 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开原创 2012-09-01 18:53:31 · 678 阅读 · 0 评论 -
面试训练顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213原创 2012-09-01 15:06:30 · 724 阅读 · 0 评论 -
面试训练树的子结构
题目:二叉树的结点定义如下:struct TreeNode{ int m_nValue; TreeNode* m_pLeft; TreeNode* m_pRight;};输入两棵二叉树A和B,判断树B是不是A的子结构。例如,下图中的两棵树A和B,由于A中有一部分子树的结构和B是一样的,因此B就是A的子结构。原创 2012-09-02 17:39:12 · 573 阅读 · 0 评论 -
面试训练复杂链表的复制
题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: struct ComplexNode{ int m_nValue; ComplexNode* m_pNext; ComplexNode* m_pSibling;原创 2012-09-02 23:01:59 · 478 阅读 · 0 评论 -
面试训练二叉树两结点的最低共同父结点
题目:二叉树的结点定义如下:struct TreeNode{ int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。我的思路就是,普通的递归方式遍历二叉树,但是当遇到一个节点值相同时,如果为左子树则遍历右子树(当然此时另外一个原创 2012-09-02 23:34:54 · 783 阅读 · 0 评论 -
面试训练去除c/c++中的注释
程序员面试宝典上面的题目有很多是很经典的问题,可供我们思考,而且会对我们面试有很大好处。下面是第45页的一个题目:编写一个函数,实现把C/C++程序代码中的注释去掉,我开始看的时候总是看不懂,后来在网上看到一个网友详细的分析了其代码,但是我看了之后觉得有好多地方他分析的都不对,于是,我自己又花了半天的时间分析了一遍,觉得自己理解了,下面给出我的分析语句。如果还有不严谨的部分,请指教!原创 2012-09-04 12:57:20 · 1097 阅读 · 0 评论 -
面试训练数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。第一种思路 当然是如果无序的话,先排序O(n logn),然后O(n)遍历数组第二种思路 当然是取哈希,key为数字,value为出现数字,然后o(n)遍历哈希表海涛思路就是只判断前后两个元素的关系,重复利用数组的特性,一个数字出现的次数超过了数组长度的一半。那么我遍历数组 当后面元素和前面不同原创 2012-09-03 17:19:14 · 663 阅读 · 0 评论 -
面试训练对称子字符串的最大长度
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。思路 :这道题目需要思考一会,主要的解决方案其实 就是从中间到两边的扩散判断1 当向右扩散遇到一个相同的节点,则进行从内向外扩散 左边节点-1,-2..,右边节点+1,+2...边界条件 -1需判断左边界,+1需判断原创 2012-09-03 18:21:50 · 466 阅读 · 0 评论 -
面试训练字符串子串问题
这道题很有意思,看了使用sprintf后果然觉得 掌握好c语言库函数有着很好的优势O(n)的时间复杂度,只需判断前后两个元素,做累加即可,感觉很有意思代码如下#include "stdio.h"#include "string.h"int main(){ char str[1024]; char temp[1024]; int i=0,len; int count原创 2012-09-05 10:50:29 · 517 阅读 · 0 评论 -
数据库考点回顾
1 数据库理论1NF :第一范式。如果关系模式R的所有属性的值域都是不可再分解的值,则称R 属于第一范式 第一范式的模式要求属性值不可再分裂成更小部分,即属性项不能使属性项组合或由组属性组成2NF :第二范式。如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称R为第二范式模式。 如果某个数据库模式中原创 2012-09-05 12:04:25 · 840 阅读 · 0 评论 -
操作系统的考点
1 cpu里面的cache和 操作系统里面的cache有什么不同呢快表---cache在OS中运用的典范在操作系统中,为提高系统的存取速度,在地址映射机制中增加了一个小容量的联想寄存器(相联存储器),即快表,用来存放当前访问最频繁的少数活动页面的页号。当某用户需要存取数据时,根据数据所在的逻辑页号在快表中找到其对应的内存块号再联系页内地址,形成物理地址。如果在快表中没有相应原创 2012-09-05 11:07:13 · 856 阅读 · 0 评论 -
12个有趣的C语言面试题
12个有趣的C语言面试题发表于09-06 09:15|8916次阅读| 来源CSDN|32 条评论| 作者王然面试题C摘要:12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个!1.gets()函数问:请找出下面代码里的问题:#include int main(void) { char buff[10]; memse转载 2012-09-07 11:18:00 · 523 阅读 · 0 评论 -
面试训练二维数组
这是海涛书上面的一道题目感觉很有意思。思路呢就是 根据数组的特性吧,因为右上角为行最大,列最小,那么和我们相比较的元素相比,不管如何如果大 则减列,如果小则减行。这样不断缩小我们查询的范围,可谓是经典中的经典啊。书中采用右上角那么我也来小试牛刀#include "stdio.h"int findRightBound(int **data,int rows,int cols,i原创 2012-09-07 15:47:07 · 398 阅读 · 0 评论 -
面试训练旋转数组的最小元素
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。思路:最简单的思路当然就是o(n)时间遍历数组,如果数组中出现分界点,即前面大后面小,则为该最小值代码#include "stdio.h"int原创 2012-09-07 14:42:37 · 507 阅读 · 0 评论 -
面试训练排序
随便写个快排吧基本的#include "stdio.h"int Partion(int *data,int s,int e){ int i=s; int temp; int k=s-1; int v = data[e]; for(i=s;i<e;i++) { if(data[i]<data[e]) { temp = data[i]; data[i] =原创 2012-09-07 21:34:50 · 629 阅读 · 0 评论 -
面试训练二进制中1的个数
海涛的思路相当犀利比如 1100 包含1的个数先减-1 的1011 没改变高位的1 只改变地位 ,1100&1011 ---》1000刚好去除了最右边低位的1.那么简单方面可以直接写出来int data(int n){ int num=0; while(n) { num++;原创 2012-09-07 22:46:06 · 774 阅读 · 0 评论 -
面试训练链表问题
这种问题很经典,链表的求是否有环,以及链表数目为奇数或偶数返回中间节点,都可以不同步速率移动指针达到效果。非常棒就地反转链表以前实习的时候遇到过一次,上次完全没准备什么东西,搞半天没有出结果。今天我来秒杀它#include "stdio.h"typedef struct Node{ int key; struct Node *next;}Lnode;void buil原创 2012-09-09 10:50:11 · 527 阅读 · 0 评论 -
面试训练替换空格
该题我第一感觉 就是用空间换时间然后海涛的思路就是用两个指针 先计算所需空间 然后从后往前拷贝,这样可以达到O(n)#include "stdio.h"#include "string.h"int main(){ char str[1024] = "my hobby is hello"; int len = strlen(str); char temp[1024]; ch原创 2012-09-07 17:03:04 · 451 阅读 · 0 评论 -
面试训练从尾到头打印指针
实现来说很简单,用栈或是递归都可以实现#include "stdio.h"#define OK 0#define ERROR 1typedef int MYTYPE;typedef struct Node{ int data; struct Node *next;} LNode;int buildList(LNode **head,int data){ LNode *原创 2012-09-07 17:37:33 · 388 阅读 · 0 评论 -
面试训练求1+2+...n
这种情况需要明确是否考虑大数。个人感觉实现起来 用加1操作比较简单,但是考虑起来还需要细心主要就是从低位开始每一次加1 然后打印。判断边界条件需要明确一个原则,最高位如果有进位 那么则超过范围,不打印#include "stdio.h"int incre(char *number){ int length = strlen(number); int takeover =0;原创 2012-09-08 11:38:19 · 1050 阅读 · 0 评论 -
面试训练斐波那契数列
这个数列是写了很多遍了,各种方法都有效率最低,递归效率可以,用两个变量保存,每步结果#include "stdio.h"/*f[n] = f[n-1]+f[n-2]*/int main(){ int f0=0; int f1=1; int i; int f2; for(i=2;i<10;i++) { f2= f1+f0; printf("%d %d %d原创 2012-09-07 22:19:03 · 846 阅读 · 0 评论 -
面试训练树的子结构
看看书吧,这部分代码code又要动手,休息一会,然后再来搞起原创 2012-09-09 12:10:35 · 464 阅读 · 0 评论