
算法设计
老板来碗馄饨
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
重建二叉树
对于一颗二叉树,可以根据先序遍历(后序遍历)和中序遍历重新还原出二叉树。原创 2014-10-05 17:17:37 · 387 阅读 · 0 评论 -
写一个函数输出一个字符串中的所有排列
我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前转载 2014-05-28 16:49:45 · 1518 阅读 · 0 评论 -
把一个有序整数数组放到二叉树中
#include#includestruct node{ int num; node *left; node *right;};void creatree(node *&p,int a[],int start,int end)//使用*&p的原因//要在函数体内修改形参的值,并且这个修改能作用到外面调用的实参,用单独的指针就不行,只能用指针的引用或者指针的指针{ if(st原创 2014-05-28 20:43:08 · 593 阅读 · 0 评论 -
怎样把一个链表掉个顺序
#include#includestruct node{ int num; node *next;};void creatnode(node *&p,int a[],int n,int len)//建立一个链表{ if(n<len) { p=(node *)malloc(sizeof(node)); p->num=a[n]; if(n==len-1) {原创 2014-05-28 21:31:23 · 719 阅读 · 0 评论 -
编程实现两个正整数的除法
#includevoid div2(const int x,const int y)//利用减法实现{ if(y==0) { cout<<"error"<<endl; return; } else { int num=0,m=x; while(m>=y) { m-=y; num++; } cout<<num<<endl; }}voi原创 2014-05-28 22:07:19 · 786 阅读 · 0 评论 -
设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。注意:- 5个数值允许是乱序的。比如: 8 7 5 0 6- 0可以通配任意数值。比如:8 7 5 0 6 中的0可以通配成9或者4- 0可以多次出现。- 要求复杂度要小于O(n2)。原创 2014-05-29 18:11:06 · 1589 阅读 · 0 评论 -
找出二叉树上任意两个节点的最近共同父节点
#include#includestruct node{ int num; node *left; node *right;};void creatree(node *&p,int a[],int start,int end)//使用*&p的原因//要在函数体内修改形参的值,并且这个修改能作用到外面调用的实参,用单独的指针就不行,只能用指针的引用或者指针的指针原创 2014-05-31 16:24:01 · 3651 阅读 · 0 评论 -
一颗排序二叉树,令f=(最大值+最小值)/2,找出距离f值最近、大于f值的结点
#include#includestruct node{ int num; node *left; node *right;};void creatree(node *&p,int a[],int start,int end)//使用*&p的原因//要在函数体内修改形参的值,并且这个修改能作用到外面调用的实参,用单独的指针就不行,只能用指针的引用或者指针的指针原创 2014-05-31 18:21:03 · 848 阅读 · 0 评论 -
一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1
#include/*本题假设N为2000,申请一个标记数组大小为n的一半,两个数的和为N+1,也就是2001分析一个数小于等于1000,一个大于等于1001,这样如果一个数小于等于1000则放在tag【i】处若大于则放在tag【2001-i】处,最后在遍历一下tag数组,元素为2的个数就是满足条件的对数*/void main(){ int a[2001]={1,401,63原创 2014-05-31 21:11:13 · 2285 阅读 · 2 评论 -
正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项
正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项,例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12原创 2014-06-25 20:21:34 · 1466 阅读 · 0 评论 -
有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面
有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(大写或小写字母之间不要求保持原来次序),如有可能尽量选择时间和空间效率高的算法。c语言函数原型void proc(char *str),也可以采用你自己熟悉的语言。原创 2014-06-25 21:31:11 · 3321 阅读 · 0 评论 -
如何随机选取1000个关键字
如何随机选取1000关键字给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字)。如何才能从这个无穷尽的流中随机的选取1000个关键字?原创 2014-06-26 10:08:11 · 1243 阅读 · 0 评论 -
判断一个自然数是否是某个数的平方
方法1:从1到2/m开始,一次遍历,判断原创 2014-06-26 11:05:56 · 395 阅读 · 0 评论 -
用C语言实现一个revert函数
用C语言实现一个revert函数,它的功能室原创 2014-07-05 17:09:08 · 1065 阅读 · 0 评论 -
用C语言实现函数 memmove
用C 语言实现函数void * memmove(void *dest,const void *src,size_t n)。memmove函数的功能是拷贝src 所指的内存内容前n 个字节到dest 所指的地址上原创 2014-07-05 17:38:01 · 456 阅读 · 0 评论 -
检查字符是否是整数,如果是,返回其整数值
遍历字符串判断每个字符原创 2014-05-28 16:11:30 · 630 阅读 · 0 评论 -
求一个字符串中连续出现次数最多的子串
把字符串写成后缀组其实相当于站在不同的位置往后看这个数组,所以其实并不需要额外增加存储空间来生成后缀组。转载 2014-05-15 20:17:26 · 505 阅读 · 0 评论 -
使用两个队列实现一个栈
解法:有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。如果继续做push操作,比如插入d,f,则把d,f插入到q2中,此时若要做pop操作,则做步骤2以此类推,就实现了用两个队列来实现一个栈的目的。原创 2014-10-05 19:20:11 · 532 阅读 · 1 评论 -
旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.原创 2014-10-05 20:01:22 · 493 阅读 · 0 评论 -
二维数组中查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。原创 2014-10-03 10:58:25 · 324 阅读 · 0 评论 -
替换空格
请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。原创 2014-10-03 15:28:54 · 345 阅读 · 0 评论 -
从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值思路:1,栈,根据面试官需要是否要改变链表结构2,递归,原理用到栈3,可以改变链表结构,就把链头变链尾,改变指针方向原创 2014-10-03 16:26:53 · 368 阅读 · 0 评论 -
用两个栈实现队列
题目:用两个栈实现一个队列。队列的生命如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。template class CQueue{public: CQueue(void); ~CQueue(void); void appendtail(const T& node); T deleteH原创 2014-10-05 19:07:59 · 349 阅读 · 0 评论 -
找出一条走棋线路到第m使所有格子的权值之和最大
矩阵最大值 给你一个N*M的矩阵,矩阵的每个格子都有相应的权值。原创 2014-09-18 21:10:35 · 674 阅读 · 0 评论 -
2015网易校园招聘算法题留存
先存在csdn上以后慢慢研究原创 2014-09-18 21:16:25 · 469 阅读 · 0 评论 -
小米校园招聘笔试题寻找相似的帖子
寻找标题相同或者关键字一样的帖子,按组输出帖子的id,我们可以先用两个for循环将所有相似的帖子放到二维数组里面,arr[][],例如arr[i][j]表示id是i的帖子和j的帖子相似,然后就开始遍历这二维数组按照要求输出id组首先建表示帖子的类原创 2014-09-19 12:37:05 · 430 阅读 · 0 评论 -
输入两个整数n和m, 从数列1,2,...,n中任意选择几个数,使其和等于m, 要求编写程序输出所有的组合
01背包问题#include#includeint length;void PrintSolutions(int *flag){ for (int i=1; i<=length; i++) { if (flag[i] == 1) { cout << i << " "; } }原创 2014-09-20 19:06:07 · 619 阅读 · 0 评论 -
寻找兄弟字符串
如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串, 问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。原创 2014-07-22 20:27:00 · 769 阅读 · 0 评论 -
从外层顺时针螺旋矩阵
打印出如图的顺时针螺旋矩阵原创 2014-05-13 20:44:58 · 1446 阅读 · 0 评论 -
由内向外按顺时针方向扩张的螺旋矩阵
public static void main(String[] args) { int x=1,y=2; int t=(Math.abs(x)>Math.abs(y)?Math.abs(x):Math.abs(y));// 求出层数 int u=t+t;//2t int v=u-1;//2t-1 v=v*v+u;//(2t-1)的平方+2t if(x=原创 2014-05-13 21:52:17 · 1006 阅读 · 0 评论 -
求zigzag数组矩阵
输入一个数字n,然后生成n×n的矩阵,矩阵的内容沿45度线递增原创 2014-05-14 10:30:00 · 541 阅读 · 0 评论 -
删除两个双向循环链表的相同节点
有双向循环链表结点定义为:struct node{ int data; struct node *front,*next;};有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除。原创 2014-07-08 17:02:44 · 777 阅读 · 0 评论 -
(最长回文字串)字符串中对称的子字符串的最大长度
输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“goooogle”, 由于该字符串里最长的对称子字符串是“goooog”, 因此输出 6。原创 2014-07-09 16:50:32 · 444 阅读 · 0 评论 -
顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如:如果输入如下矩阵: 1 2 3 45 6 7 89 10 11 1213 14 15 16 则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。原创 2014-07-09 12:20:13 · 305 阅读 · 0 评论 -
找出数组中唯一的重复元素
1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?原创 2014-07-10 15:42:27 · 389 阅读 · 0 评论 -
求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)
#include #include using namespace std;//两个数的最大公约数--欧几里得算法int gcd(int a, int b){ if (a < b) swap(a, b); if (b == 0) return a; else return gcd(b, a%b);}//n个数的最大公约数算法//说明: //把n转载 2014-07-10 16:55:54 · 739 阅读 · 0 评论 -
排序N个比N^7小的数,要求的算法是O(n)
算法思路:采用基数排序,用10个桶(vector),每一个桶用队列表示(queue),分别代表0-9,然后依次从低位到高位开始将要排序的数倒入桶中,然后再顺序取出来,直到排序完成。若有5个数,12,4,5,130,28第一次(个位):0: 13012: 1234: 45: 5678 :289然后顺序取出来,130, 12, 4转载 2014-07-16 12:08:56 · 558 阅读 · 0 评论 -
在一个整形数组中去掉重复的数字
请把一个整形数组中重复的数字去掉。例如: 1, 2, 0, 2, -1, 999, 3, 999, 88 答案应该是: 1, 2, 0, -1, 999, 3, 88原创 2014-07-18 10:35:08 · 911 阅读 · 0 评论 -
在排序数组中,找出给定数字的出现次数
比如【1,2,2,2,3】中2出现的次数是3次#includeint search1(int a[],int num,int len)//暴力求解判断比较数组中的数{ int sum=0; for(int i=0;i<len;i++) { if(a[i]<=num&&a[i]==num) sum++; if(a[i]>num)//对于大于查找的数字可以直接返回,这是一原创 2014-05-29 16:10:01 · 715 阅读 · 0 评论 -
把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列。
#include using namespace std;char * get2String(long num){ int i = 0; char * buffer = NULL; char * temp = NULL; buffer = (char *)malloc(33); temp = buffer; for(i=0; i<32; i++)转载 2014-07-08 14:26:59 · 734 阅读 · 0 评论