
程序员编程艺术
文章平均质量分 73
_王川
屌丝程序员
展开
-
第三十九章续:区间最值RMQ问题
问题描述:找出数组A[],任意区间[i,j]的最小值/*RMQ问题区间最值查询*/#include using namespace std;#define MAX 100//方法1//M[i][j]表示区间i,j最值的索引//构造M复杂度O(n^2)void RMQ1(int M[][MAX],int A[],int N){ int i, j;原创 2014-02-13 17:12:01 · 1041 阅读 · 0 评论 -
第二十七章:不改变正负数之间相对顺序重新排列数组
一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序。比如: input: 1,7,-5,9,-12,15 ,ans: -5,-12,1,7,9,15 。且要求时间复杂度O(N),空间O(1) 。没有什么很好的方法#include #include #include using namespace std; vo原创 2014-02-11 11:47:23 · 1248 阅读 · 0 评论 -
第三十三章:木块砌墙
题目:用 1×1×1, 1× 2×1以及2×1×1的三种木块(横绿竖蓝,且绿蓝长度均为2),搭建高长宽分别为K × 2^N × 1的墙,不能翻转、旋转(其中,0有多少种方案,输出结果对1000000007取模。举个例子如给定高度和长度:N=1 K=2,则答案是7,即有7种搭法,如下图所示:原创 2014-02-11 14:05:28 · 1158 阅读 · 0 评论 -
第十二章:数的判断
数的判断题目如下7、腾讯面试题:给40亿个不重复的unsignedint的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?分析:1个unsigned int占用4字节,40亿大约是4G个数不到,那么一共大约要用16G的内存空间,如果内存不够大,反复和硬盘交换数据的话,后果不堪设想。位图法://腾讯面试题:给40亿个不重复的unsign原创 2014-02-10 19:31:28 · 864 阅读 · 0 评论 -
第二十三章:杨氏矩阵查找、排序、添加、删除
Young氏矩阵在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。算法思想://杨氏矩阵#include using namespace std; #define ROW 4#define COL 4//杨氏矩阵调整,右下调原创 2014-02-10 23:51:55 · 1787 阅读 · 0 评论 -
第二十八章:最大连续乘积子串
最大连续乘积子串题目描述:给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8。也就是说,上述数组中,3 0.5 8这3个数的乘积3*0.5*8=12是最大的,而且是连续的。#include #include #include using namespace std; /*原创 2014-02-11 11:53:48 · 978 阅读 · 0 评论 -
第二十八章续:任意(N-1)个数的组合中乘积最大的一组
题目描述:给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间复杂度。#include #include #include using namespace std; /*给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间原创 2014-02-11 13:25:41 · 1216 阅读 · 0 评论 -
第三十五章:完美洗牌算法
完美洗牌算法 题目详情:有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法。#include #include #include using namespace std; /* 完美洗牌算法原创 2014-02-11 16:00:03 · 1129 阅读 · 0 评论 -
第三十四章:格子取数问题
格子取数问题 题目详情:有n*n个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右,一共走两次(即从左上角走到右下角走两趟),把所有经过的格子的数加起来,求最大值SUM,且两次如果经过同一个格子,则最后总和SUM中该格子的计数只加一次。动态规划:DP[step,i,j]表示的是第step步(每两步算一步)走到第i行和第j行(不需原创 2014-02-11 15:06:42 · 2095 阅读 · 0 评论 -
第三十九章:最近公共祖先LCA问题
最近公共祖先LCA问题问题描述:求二叉树的任意两个节点的最近公共祖先Tarjan算法/*//最近公共祖先题目描述:给定一棵带权树,求u,v两节点的最短长度算法思想:找到u,v两点的最近公共祖先lca(v)若dis[u]表示根节点到u的长度,则res=dis[u]+dis[v]-2*dis[lca(v)]*/#include #include #d原创 2014-02-11 17:24:38 · 1013 阅读 · 0 评论 -
第三十三章续:用1 x 2的多米诺骨牌填满M x N的矩形有多少种方案
题目描述:用1 x 2的多米诺骨牌填满M x N的矩形有多少种方案,M 矩阵乘法:#include #include #include using namespace std; #define SIZE (1<<m)#define MAX_SIZE 32class CMatrix{ public: long el原创 2014-02-11 14:28:46 · 5459 阅读 · 0 评论 -
第十四章:提取出某日访问百度次数最多的那个IP
提取出某日访问百度次数最多的那个IP问题描述:海量日志数据,提取出某日访问百度次数最多的那个IP。分析:IP地址是32位的二进制数,所以共有N=2^32=4G个不同的IP地址, 创建一个unsigned count[N];的数组,即可统计出每个IP的访问次数#include #include #include using namespace std;原创 2014-02-10 19:33:00 · 1479 阅读 · 0 评论 -
第十三章:遍历n个元素取出等概率随机取出其中之一元素
第二部分、遍历n个元素取出等概率随机取出其中之一元素问题描述1.一个文件中含有n个元素,只能遍历一遍,要求等概率随机取出其中之一。选取策略: 顺序遍历,当前遍历的元素为第L个元素,变量e表示之前选取了的某一个元素,此时生成一个随机数r,如果r%L == 0(当然0也可以是0~L-1中的任何一个,概率都是一样的), 我们将e的值替换为当前值,否则扫描下一个元素直到原创 2014-02-10 19:32:15 · 1197 阅读 · 0 评论 -
第八章:虚函数笔记(虚函数碉堡了)
详见:程序员编程艺术:第八章、从头至尾漫谈虚函数一、题目要求:写出下面程序的运行结果?//谢谢董天喆提供的这道百度的面试题 #include using namespace std; class A{ public:virtual void p() { cout << "A" << endl; } }; class B :原创 2014-02-10 16:30:33 · 924 阅读 · 0 评论 -
第二章:字符串是否包含问题
题目描述:假设这有一个各种字母组成的字符串A,和另外一个字符串B,字符串里B的字母数相对少一些。什么方法能最快的查出所有小字符串B里的字母在大字符串A里都有?比如,如果是下面两个字符串:String 1: ABCDEFGHLMNOPQRSString 2: DCGSRQPO答案是true,所有在string2里的字母string1也都有。 如果是下面两个字符串:原创 2014-02-09 20:55:45 · 1082 阅读 · 0 评论 -
第五章:寻找满足和为定值的两个或多个数
第一节、寻找和为定值的两个数、三个数、四个数题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。参见:LeetCode2.1.7 Two Sum 2.1.8 3S原创 2014-02-10 13:04:53 · 1718 阅读 · 0 评论 -
第四章:一些字符串函数的实现
//得10分,基本上所有的情况,都考虑到了 //如果有考虑到源目所指区域有重叠的情况,加1分! char * strcpy( char *strDest, const char *strSrc ) { if(strDest == strSrc) { return strDest; } assert( (strDest !=原创 2014-02-10 12:20:29 · 896 阅读 · 0 评论 -
第六章:求解500万以内的亲和数
亲和数问题题目描述:求500万以内的所有亲和数如果两个数a和b,a的所有真因数之和等于b,b的所有真因数之和等于a,则称a,b是一对亲和数。例如220和284,1184和1210,2620和2924。注:亲和数问题最早是由毕达哥拉斯学派发现和研究的。他们在研究数字的规律的时候发现有以下性质特点的两个数:220的真因子是:1、2、4、5、10、11、20、22、44、55原创 2014-02-10 15:17:00 · 1277 阅读 · 0 评论 -
第三章续:O(n)复杂度算法
#include #include #include #include #include #include #include #include #include using namespace std;inline int my_rand(int low, int high) { srand((unsigned)time(NULL)); int si原创 2014-02-10 11:26:51 · 1014 阅读 · 0 评论 -
第三章再续:伴随数组求数组中给定下标区间内的第K小(大)元素
思想很巧妙,#include #include #include #include #include #include #include #include #include using namespace std;struct node{ int num,data; bool operator < (const node &p) const原创 2014-02-10 12:13:32 · 783 阅读 · 0 评论 -
第一章:左旋转字符串
#include #include #include #include #include using namespace std;//第一种方法,官方提供,代码比较简单template void _rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator las原创 2014-02-09 20:11:47 · 889 阅读 · 0 评论 -
第三章:寻找最小的k个数
#include #include #include #include #include #include #include #include #include #include using namespace std;#define N 20//最大的N个数//第一种方法,维护N+1个元素的小顶堆//O(NlogK)void f1(){ //freopen("C:原创 2014-02-10 10:33:08 · 1017 阅读 · 0 评论 -
第二十一章:数组中超过出现次数超过一半的数字
第二十一章数组中出现次数超过一半的数字题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 //题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 #include #include #include using namespace std; //第一种方法//hash法,时间O(n),空间O(n)int原创 2014-02-10 20:37:21 · 785 阅读 · 0 评论 -
第二十四章:不重复Hash编码暴雪Hash算法
暴雪Hash算法:#include #include using namespace std; #define nTableSize 99991#define nMaxStrLen 30//函数prepareCryptTable以下的函数生成一个长度为0x500(合10进制数:1280)的cryptTable[0x500] unsigned long cryp原创 2014-02-11 01:38:49 · 2050 阅读 · 0 评论 -
程序员编程艺术系列
第一章:左旋转字符串第二章:字符串是否包含问题正在整理中......详情见: [置顶] 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦原创 2014-02-09 21:18:54 · 1040 阅读 · 0 评论