算法
文章平均质量分 68
alexingcool
百度基础架构部研发工程师
在发布愤怒的小鸟之前,Rovio已经默默无闻地制作了51个游戏,直到Angry Birds才一举获得成功。
展开
-
逆转链表
利用三个节点:第一个节点用于返回,也就是新的链表头节点;第二个节点是当前节点,第三个节点是当前节点的next节点code如下/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include using namespace std;int array[] = {5, 7, 6, 9, 11原创 2011-06-30 13:21:00 · 703 阅读 · 0 评论 -
N个骰子的点数
题目:把n个骰子仍在地上,所有点数#include using namespace std;const int g_maxValue = 6;const int number = 6;int array[(number - 1) * g_maxValue + 1];void probility(int original, int current, int sum, int原创 2012-08-26 12:45:33 · 1249 阅读 · 0 评论 -
回溯法
回溯法是一种枚举状态空间中所有可能状态的系统方法,它是一个一般性的算法框架解向量a=(a1, a2, ..., an),其中每个元素ai取自一个有限序列集Si,这样的解向量可以表示一个排列,其中ai是排列中的第i个元素,也可以表示子集S,其中ai为真当且仅当全集中的第i个元素在S中;甚至可以表示游戏的行动序列或者图中的路径。在回溯法的每一步,我们从一个给定的部分解a={a1, a2, ..原创 2012-08-30 22:17:21 · 968 阅读 · 0 评论 -
查找中位数的O(N)算法和Kmin算法
利用快速排序的partition操作来完成O(N)时间内的中位数的查找:#include #include #include #include using namespace std;int array[] = {1, 2, 10, 8, 9, 7, 5};const int size = sizeof array / sizeof *array;int partiti原创 2012-07-31 12:09:16 · 10964 阅读 · 0 评论 -
打印出从0到999
输入N位数,比如当N为3时,打印出从0到999#include using namespace std;void _print(char *buff, const int size, int index = 0){ if (index == size) { cout << buff << endl; return; } for (int i = 0; i <原创 2012-07-30 15:23:31 · 1240 阅读 · 0 评论 -
将二元查找树转变为排序的双向链表
2011-04-25 20:52:50例如:{10, 6, 14, 4, 8, 12, 16}的二叉搜索树,求双向链表输出:4=6=8=10=12=14=16利用递归的特性不难写出Code: /** Copyright (c) 2011 alexingcool. All Rights Reserved.*/#include#include#include using原创 2011-04-25 20:54:00 · 423 阅读 · 0 评论 -
二叉查找
下面是二叉查找返回前一个和最后一个元素的下标:/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include using namespace std;int array[] = {2, 2, 2, 2, 2};const int size = sizeof array / sizeof *原创 2011-05-12 18:55:00 · 447 阅读 · 0 评论 -
将一个字符串中的字符替换成另一个字符串
题目:原地实现字符串中的每个空格替换成"%20",例如输入"We are happy", 输出"We%20are%20happy"被替换的字符串当然不仅仅是空格,上面只是个例子这是道很好的题目,也是我进百度面试时的一道题,题目不难,但是问题得考虑全面#include #include #include using namespace std;int findNumberFi原创 2012-07-28 16:41:47 · 9356 阅读 · 0 评论 -
二叉树遍历的迭代算法
二叉树中序遍历的迭代算法:#include #include using namespace std;struct Node { Node(int i, Node* l = NULL, Node* r = NULL) : item(i), left(l), right(r) {} int item; Node* left; Node* right; }原创 2012-06-27 21:01:23 · 3213 阅读 · 2 评论 -
利用随机生成器[1,5]生成随机数[1,7]
利用随机生成器rand5()可以生成随机数[1,5]. (1,5)的随机数,可以产生(0,1)的随机数;7看成二进制111,用(0,1)产生的随机数分别对每位取值,如果取得的是000的话,舍去重新再取,得到的结果就是(1,7)之间的随机数.//generate zero or one randlyint rand2(){ int result =转载 2012-08-13 09:21:54 · 1087 阅读 · 0 评论 -
求幂计算的高效解法
题目:给定base,求base的幂exp只考虑基本功能,不做任何边界条件的判定,得到的代码如下#include using namespace std;int cacExp(int base, int exp){ int result = 1; int theBase = 1; while (exp) { if (exp & 0x01) result = r原创 2012-07-15 12:30:34 · 588 阅读 · 0 评论 -
给定push序列,判断栈的pop序列
题目:输入两个整数序列,其中一个序列表示栈的push序列,判断另一个序列有没有可能是对应的pop序列。 思路:一直压栈,直至其top为pop序列的下标所指元素 /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include #include using namespace std;con原创 2011-06-23 21:30:00 · 857 阅读 · 0 评论 -
发帖水王
关于发帖水王的求解,第一种解法是编程之美上的解法,第二种解法是寻找中位数,因为中位数必然超过一半,两种解法这里不再做解答扩展问题很好,有3个发帖很多的ID,他们的发帖数量都超过了帖子总数目N的1/4,找出他们的ID#include using namespace std;int array[] = {1, 2, 1, 1, 2, 3, 2, 2, 3, 3, 1, 3, 4, 5,原创 2012-08-26 15:49:41 · 8634 阅读 · 0 评论 -
二叉树的层序遍历
/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include using namespace std;struct Node { Node(int i = 0, Node *l = NULL, Node *r = NULL) : data(i), left(l), right(r) {} int翻译 2011-04-28 23:09:00 · 4345 阅读 · 0 评论 -
快速排序的两种实现
快速排序的两个实现,测试用例不多,可能有bug:/** Copyright (c) 2011 alexingcool. All Rights Reserved.*/#include #include #include #define DEBUG#undef DEBUGusing namespace std;int array[] = {10, 9, 8, 7, 6, 5原创 2011-04-25 13:55:00 · 486 阅读 · 0 评论 -
求前N个质数
入门级的标准解法如下:#include #include using namespace std;vector ivec;bool isPrime(int number){ bool result = true; for (int i = 2; i < number; i++) { if (number % i == 0) { result = fal原创 2012-09-13 21:32:13 · 2239 阅读 · 0 评论 -
等量正负号段落
已知一个数组,其中有正数、0、负数,请写一个函数,找出这个数组中最长的,而且正数和负数个数相同的部分数组的长度。#include using namespace std;int array[] = {1, 2, -6, 0, 3, -2, 4, 0, -1, 3, -2, -4};const int size = sizeof array / sizeof *array;#d原创 2012-09-15 20:49:17 · 706 阅读 · 0 评论 -
算法收集
1. x^3的计算无意搜到的关于计算x^3的算法,碉堡了:#include int main(void) { int x = 4, c = 0, d = 1, e = 6; while(x--){ c += d, d += e, e += 6; } printf("%d\n", c); return 0; }2.原创 2012-10-02 21:42:23 · 1498 阅读 · 0 评论 -
最低公共父节点拓展
有如下树,求最低公共父节点#include #include using namespace std;struct Node{ Node(int c = 0) : data(c) {} int data; vector nvec;};Node* construct(Node *&left, Node *&right){ Node *node10 =原创 2012-11-04 15:27:45 · 1603 阅读 · 0 评论 -
寻找最低公共父节点
最低公共父节点,意思很好理解。思路1:最低公共父节点满足这样的条件:两个节点分别位于其左子树和右子树,那么定义两个bool变量,leftFlag和rightFlag,如果在左子树中,leftFlag为true,如果在右子树中,rightFlag为true,仅当leftFlag == rightFlag == true时,才能满足条件#include using namespace原创 2012-07-17 22:00:05 · 1231 阅读 · 0 评论 -
大整数问题
1. 大整数相加#include #include #include #include #include #include using namespace std;char* add(const char *lhs, const char *rhs){ if (lhs == NULL || rhs == NULL) return NULL; int lhsLe原创 2012-09-25 23:36:07 · 514 阅读 · 0 评论 -
CSDN题目:凑硬币问题
这是一个背包问题,但是我要的不是这些,第一个给出背包代码的,20分。其他的不给分。给出我要的结果的,又分。我要什么结果呢?先看题目。你有(足够的)5分,2分,1分的硬币,现在要凑出来12分的结果,那么最少的硬币组合是?结果肯定是 【5 5 2】那么给你的硬币是 5分的,4分的(虽然我没有见过),1分的,凑8分,怎么凑?贪婪算法可能给出 【5 1 1 1】原创 2012-09-13 18:30:05 · 645 阅读 · 0 评论 -
旋转数组的二分查找
题目:旋转数组,如{3, 4, 5, 1, 2}是{1, 2, 3, 4, 5}的一个旋转,利用二分查找查找里面的数这是一道很有意思的题目,容易考虑不周全#include using namespace std;int sequentialSearch(int *array, int size, int destValue){ int pos = -1; if (ar原创 2012-07-15 13:11:15 · 876 阅读 · 0 评论 -
在数组A上有序合并数组B
题目:数组A和数组B均有序,数组A有足够大内存来容纳数组B,将数组B有序合并到数组A中分析:如果由前至后合并,复杂度将会是O(N2),这样的复杂度显然不是最优解,利用两个指针指向两个数组的尾部,从后往前遍历,这样的复杂度为O(n2)所以很快可以写出下面的代码:#include #include #include using namespace std;int arrayA[原创 2012-07-14 00:19:15 · 1374 阅读 · 0 评论 -
反转英语句子中的单词顺序
给出一个英文句子,翻转句子中单词的顺序,字符顺序也保持不变例如,输入"I am a student.",输出:"student. a am I"/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include #include using namespace std;char原创 2011-06-30 18:48:00 · 2887 阅读 · 2 评论 -
在字符串中找出连续最长的数字串
函数原型:int maxContinue(char *output, const char *input); 比如:abcd12345ed125ss123456789返回9,output指向"123456789"复杂度为O(n)code如下: #include using namespace std;const char str[] = "abcd12345ed125ss12345原创 2011-07-02 13:51:45 · 760 阅读 · 0 评论 -
就地逆转输出链表
利用递归的特性来实现,非常easy/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include using namespace std;int array[] = {5, 7, 6, 9, 11, 10, 8};const int size = sizeof array / siz原创 2011-06-30 13:25:00 · 609 阅读 · 0 评论 -
判断整数序列是不是二元查找树的后续遍历
二元查找树后续遍历特点:最后一个元素,将数组从[0...N-2]划分为两部分,前一部分所有元素比最后这个元素要小,后面的所有元素比这个元素都要大,利用递归不难写出code/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */#include using namespace std;int ar原创 2011-06-30 12:19:00 · 438 阅读 · 0 评论 -
输出链表中倒数第k个节点
输入一个单向链表,输出该链表中倒数第k个节点。/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include using namespace std;int array[] = {5, 7, 6, 9, 11, 10, 8};const int size = sizeof array原创 2011-06-30 19:10:00 · 967 阅读 · 0 评论 -
判断链表是否存在环
对于这个经典问题,最经典的解法莫过于快慢指针 #include using namespace std;struct Node{ Node(int i = 0, Node *n = NULL) : item(i), next(n) {} int item; Node *next;};int array[] = {1, -2, 3, 7, -4, 10, 2,原创 2011-06-29 22:01:00 · 378 阅读 · 0 评论 -
找出数组里大于等于左侧、小于等于右侧的所有数
例如,序列:3, 4, 2, 5, 8, 9, 10输出:8,9,10/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include #include #include #include using namespace std;#define INF 65535i原创 2011-06-25 09:52:00 · 1581 阅读 · 0 评论 -
输入一个字符串,打印出该字符串中字符的所有排列
例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include #include using namespace std;char array[] = {a, b翻译 2011-06-24 19:46:00 · 4779 阅读 · 2 评论 -
输入一颗二元查找树,将该树转换为它的镜像
递归的解法:/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include #include #include using namespace std;struct Node { Node(int i = 0, Node *l = NULL, Node *r = NULL)原创 2011-06-23 22:13:00 · 767 阅读 · 0 评论 -
和为n连续正整数序列
<br />/** Copyright (c) 2011 alexingcool. All Rights Reserved.*/#include <iostream>#include <iterator>#include <algorithm>using namespace std;void print(int i, int j) { for(int k = i; k < j; k++) cout << k << " "; cout << endl;}原创 2011-04-28 16:00:00 · 732 阅读 · 0 评论 -
计算树的深度
<br />/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream>using namespace std;struct Node { Node(int i = 0, Node *l = NULL, Node *r = NULL) : data(i), left(l), right(r) {} int data; Node *left; Node *ri原创 2011-04-28 16:43:00 · 3094 阅读 · 1 评论 -
最大间隙问题
参考http://blog.csdn.net/livelylittlefish,并加以改进,Code属于原创。#include using namespace std;#define INF 65535double array[] = {2.3, 3.1, 7.5, 1.5, 6.3, 7.8};const int size = sizeof array / sizeof *array;double GetMaxGap(double (&array)[size]) {原创 2011-04-24 16:21:00 · 960 阅读 · 0 评论 -
求最大连续递增数字串
例如:源串为"ads3s1456789DF3456ld345AA"输出为"456789"#include using namespace std;char strSource[]="123456789ad0123456789s3sl456789原创 2011-07-06 13:41:32 · 2490 阅读 · 0 评论 -
Fabonacci数列
面试此题时,如果回答递归求解,那就贻笑大方了int fabonacci(int n){ if(n == 0) return 0; if(n == 1) return 1; return fabonacci(n - 1) + fabonacci(n - 2);}上述复杂度是指数级的,O(2^n)如果用表来存储可以降低到O(n)#includ原创 2011-07-03 10:05:23 · 813 阅读 · 0 评论 -
打印1到最大的n位数
题目:输入数字n,按顺序打印出从1最大的n位十进制数,比如输入3,则打印出1,2 ,3一直到最大的3位数999#include using namespace std;void printArray(char *array, int size){ if (array == NULL || size <= 0) { return; } int index =原创 2012-07-15 20:30:24 · 1575 阅读 · 1 评论 -
杨辉三角
得知同学拿到MS offer,羡慕嫉妒恨,杨辉三角一题,MD好久没写代码了:#include using namespace std;void printYangHui(int line){ int **array = new int*[line]; for (int i = 0; i < line; i++) array[i] = new int[line]; for原创 2012-07-12 00:26:43 · 436 阅读 · 0 评论