
编程珠玑
世纪殇
一个不断保持前进的程序员,目前潜心在数据分析和中等网站架构设计中
展开
-
百度面试题-海量日志,读取IP
4、海量日志数据,提取出某日访问百度次数最多的那个IP。回答:如果日志文件足够的大,大到不能完全加载到内存中的话。那么可以考虑分而治之的策略,按照IP地址的hash(IP)%1024值,将海量日志存储到1024个小文件中。每个小文件最多包含4M个IP地址。对于每个小文件,可以构建一个IP作为key,出现次数作为value的hash_map,并记录当前出现次数最多的1个IP地址。原创 2014-04-13 22:56:06 · 1295 阅读 · 0 评论 -
最长公共子序列
class LCS {public: int findLCS(string A, int m, string B, int n) { int mn[50][50]={0}; //初始化 for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { mn[i][j]=0; if(A.at(i-1)==B.at(j-1)原创 2015-08-13 17:05:24 · 477 阅读 · 0 评论 -
遍历整个二叉树的所有路径
如果将所有的二叉树的路径中的节点值的和的最大值vector g_vec;int g_max=0;int maxPathSum(TreeNode *root){ if(root!=NULL) { g_vec.push_back(root); if(root->left==NULL&&root->right==NULL) { int max=0; vector:原创 2015-07-31 19:08:44 · 3312 阅读 · 0 评论 -
获得一个数组的全排列
例如 char a[]="abcd"求这个数组的全排列,将复杂问题或者不能直接解决的问题转变为多个简单问题的方法就是,让所有的元素一次成为第一个元素,void Traversal(char* const a,char* const pBegin){ if(NULL==a) return; if('\0'==*pBegin) { cout<<a<<endl; } else原创 2015-07-21 21:15:27 · 2156 阅读 · 0 评论 -
关于递归的各种操作
现在说说,现在说说struct Node{ Node* left; Node* right; int val; Node(int a):val(a){ left=NULL; right=NULL; }};//获得整棵树的深度int GetDepth(Node* root){ if(NULL==root) { return 0; } int lDepth=G原创 2015-08-01 19:53:46 · 645 阅读 · 0 评论 -
关于atoi的函数实现
int atoi(char* mm){ if(NULL==mm) { return 0; } bool positive=true; if(mm[0]=='-') { positive=false; mm++; } if(mm[0]=='+') { mm++; } int sum=0; long long lsum=0; for(char* index=原创 2015-08-02 18:06:46 · 570 阅读 · 0 评论 -
子树的包含问题
判断一棵树是否是另一棵树的子树,操作方法主要分成两部分,第一部分是确定子树的根节点在待检测树中的位置,检测方法很是简单,使用先序遍历整棵树,如果遍历中节点的值等于子树的根节点的值即可第二部分,是在第一部分的基础上,已经有了两个根节点,所以我们可以使用递归的方法,进行判断,直到带判断的两个节点中有一个是NULL即可struct BinTree{ int val; BinTree*原创 2015-07-22 09:19:04 · 726 阅读 · 0 评论 -
判断一个数列是否是二叉树后序遍历的结果
例如数组 a[]={5,7,6,9,11,10,8}判断是否是二查搜索树后序遍历,则只需要将该序列还原为搜索二叉树,即可,但是二叉树的还原过程1.确定根节点所在,当然因为是后续所以根节点在数组的末尾元素2.确定两棵子树的范围以及依次插入的方向在此题中8 为根节点所在 6 和10 是距离根节点最近的元素,也即插入方向是从6 和10 开始顺次向前,6到5的位置截止,10到9的位置截止原创 2015-07-22 10:08:35 · 1875 阅读 · 0 评论 -
获得一个数组中所有元素进行的全排列,获得其中最小的数字
现有一个数组int a[]={32,3,65};我们将这个数组中的所有数字进行排序#includeusing namespace std;//把数组排成最小的数int a[]={2,56,1};char tmp[256]={0};char dst[256]={0};void pailie(char* pstr,char*begin){ if(*begin=='\0') {原创 2015-07-23 16:53:32 · 1448 阅读 · 0 评论 -
由无序数组中找到第K 大的元素
当然如果我们想要实现这个问题会有很多思路,可以将原来的数组进行排序即可,直接随机访问到第K个元素即可。我们专门写一篇博客当然不是想利用这种思路的,可以试试改进的快速排序啊,对不,我个人觉得是利用了两种思路一个是快速排序一个是二分查找,在进行快速排序的时候,在指定范围内找到该值的下标,如果该下标与K值相比比较大,则结束end=index-1,相反的话 start=index+1即可当然因为原创 2015-07-23 15:43:35 · 4814 阅读 · 1 评论 -
二叉树中所有路径的和为一特定值
这里与之前不同的是,我们选择的路径的规定是起点可以是任何节点,同样终点也可以是任何节点#include#includeusing namespace std;struct Node{ int val; Node* left; Node* right; Node(int x=0):val(x),left(NULL),right(NULL){ }};void findpath(原创 2015-08-04 14:46:25 · 565 阅读 · 0 评论 -
逆序的BSF输出
查看逆序的BSF输出如图所示:这里,我们首先创建一颗二叉树,并使用先序遍历,依次计算其中每个节点的深度,其次利用BSF算法,利用deque获得序列,但同时使用vector只进行push_back无pop_front这样,vector中就是根据BSF优先算法获得的序列,但还是没有逆序,就利用深度的不同获得,依次递减,进行输出:#include "stdafx.h"#includ原创 2015-08-04 19:27:12 · 581 阅读 · 0 评论 -
获得一个2n数组中的N个元素,使得该N个元素与剩余元素和最小
void MaoPao(int * a,int low,int high,bool BMax){ if(NULL==a) { return ; } if(low<high) { if(BMax) { //开始存放最大值 for(int i=high;i>low;i--) { if(a[i]>a[i-1]) { int tmp=a原创 2015-07-24 19:12:36 · 1109 阅读 · 0 评论 -
根据已知入栈顺序判断一个数组是否是出栈顺序
题目含义已经很明确了,现在开始使用一个样例输入和输出int a[]={1,2,3,4,5};//原始的入栈顺序int b[]={4,5,3,1,2};//出栈顺序int b1[]={4,5,3,2,1};//出栈顺序我的策略是依次遍历给定的出栈顺序数组,从第一个开始,以b为例,1、第一个元素是4,则在a中确定4所在的位置,将4之前的所有元素入栈记为sck,并记录该位置nCoun原创 2015-07-20 08:37:46 · 2116 阅读 · 0 评论 -
数组矩阵的顺时针输出
其实这个题目,我要讲的并不是这个题目的编码过程,而是对于这个问题解决过程:我们不能遇到这个问题之后立即编码是错误的,然而立即拿出笔在纸上写写画画时,也是需要进行技巧的,针对这个问题,我们首先看看顺时针时,走一圈作为一个循环,然而该循环的起点是很有意思的,这个点的所在的点行坐标和列坐标是相同的也即是双层循环的,一层内部循环是要进行四个方向的的遍历。从左到右 从上到下原创 2015-07-19 21:20:49 · 2350 阅读 · 0 评论 -
编程珠玑-位图
一个很偶然的机会,读到了编程珠玑这本书,很是折服,本以为自己的水平已经到了某一瓶颈,所要做的只能是等待时间的沉淀,可看到了这本书之后,觉得自己傻得可笑,原来自己从未走进过编程的世界里,呵呵,所以啊,笨鸟要飞了! 编程珠玑的第一章节就是关于位图,以前从没想过使用这种方式进行数据的排序,可看到了之后分明觉得,编程思想才是IT人的根本所在,好了,闲话不说,此种方法就是使用一个二进制位的集合原创 2014-03-21 15:30:15 · 1085 阅读 · 0 评论 -
编程珠玑的二分法
二分法,究其根本就是在已经排好序的基础上进行的数据查找,该方法具有较高的效率,特别好用// 进化的二分法.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#includeusing namespace std;templateint Find_By_Binary(Any* ptr ,int nLength,Any value){ int原创 2014-04-03 09:38:36 · 888 阅读 · 0 评论 -
编程珠玑-内存交换
举例说明如果有这样的一个数组,pStr="abcdefg",现在呢,假设A="abc",B="defg",pStr=AB,现在想要pStr=BA,那应该怎么做呢,传统的做法是开辟一个临时数组,将A的内容复制到临时数组中,然后将B的内容前移A的长度个单位,然后将临时数组中存储的A的内容复制在pStr的后面,这样,我们就完成了,该功能,这样的做法是使用了,空间换取时间的做法,具有较大的空间开销,但是我原创 2014-03-25 21:31:08 · 696 阅读 · 0 评论 -
百度面试题d(n)
2、找到满足条件的数组给定函数d(n)=n+n的各位之和,n为正整数,如d(78)=78+7+8=93。这样这个函数可以看成一个生成器,如93可以看成由78生成。定义数A:数A找不到一个数B可以由d(B)=A,即A不能由其他数生成。现在要写程序,找出1至10000里的所有符合数A定义的数。原创 2014-04-10 10:01:24 · 1029 阅读 · 0 评论 -
Run Length Encoding
Description Your task is to write a program that performs a simple form of run-length encoding, as described by the rules below.Any sequence of between 2 to 9 identical characters is encoded原创 2014-10-18 11:18:40 · 1628 阅读 · 0 评论 -
奶牛问题
在农场中,奶牛家族是一个非常庞大的家族,对于家族中的母牛,从它出生那年算起,第三年便能成熟,成熟的母牛每年可以生出一只小母牛。即母牛从出生开始的第三年便 能做妈妈。最开始农场只有一只母牛,它从第二年开始生小母牛。请设计一个高效 算法,返回第n年的母牛总数,已知n的范围为int范围内的正整数。int getNum(int n){ hash_map newCows; pair原创 2015-07-25 17:44:55 · 1355 阅读 · 0 评论 -
零钱兑换问题
现在有零钱 1、3、5、10,各无数张,现在需要进行将所有的钱去换250元,请问一共有多少方案int a[]={1,3,5,10};int tmp[4]={0};int count=0;const int money=250;void getCount(int sum,int index){ if(sum>money) { return;原创 2015-07-25 18:10:31 · 1008 阅读 · 0 评论 -
关于树的某些操作
1、找到链表中的倒数第k个元素:源代码如下:struct binNode{ binNode* next; int val; binNode():next(NULL),val(0){};};binNode* createBinNode(){ int a=0; binNode *head=NULL,*cur=NULL; bool mark=false; while(cin>>a原创 2015-07-15 09:51:52 · 568 阅读 · 0 评论 -
快速排序和插入排序的C++实现
本来这是一个很常见的算法,可是接触IT这么长时间了,竟然还不知道这种算法的核心,是在惭愧,最近一直想补习这方面的内容于是也就,开始了我的算法里程,现在就说说快速排序吧,本来我一直是在用冒泡排序的,可是总是被人耻笑,所以呢,现在想想,开始学习吧 快速排序吧,总体流程是这样的,首先将获取最后一个元素,然后呢根据这最后一个元素将数组分开两部分,一部分比该元素小,另一部分比该元素大,这样就原创 2014-04-04 10:36:52 · 1022 阅读 · 0 评论 -
找到一个乱序数组排序后某一特定数值首次和末次出现的位置
不多说,上代码,我的思路是利用快速排序,进行数组排序,而后利用二分查找方法,进行快速定位int intArray[]={12,451,0,5,45,15,78,23,54,76,451};void QuickSort(int* a,int low,int high){ if(NULL==a) { return; } if(low>=high) { return ; }原创 2015-07-15 10:54:35 · 1082 阅读 · 0 评论 -
获得二叉树中两个节点的所有公共祖先
核心算法:首先使用递归方式获得最低公共祖先,然后使用队列特性,先进后出的特性使用广度搜索优先算法,按照广度进行填充在队列中,然后获得最低公共祖先元素的深度,然后我们需要遍历该队列中的所有元素,只要大于等于目标元素的深度,就可以将该元素在队列中去除,剩下的就是所有公共祖先的所有祖先了struct Node{ int val; Node* left; Node* right; Node(原创 2015-07-16 21:33:25 · 1318 阅读 · 0 评论 -
掷骰子,求得每个数的概率
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。 先分析思路,再看实现。 首先解决前提性的问题:一个骰子的点数只可能是[1,6],所以S的值的取值范围是[n,6n],这里当然只考虑整数。 思路一:统计各个S值出现的次数,然后 各个S值出现的概率 = 各个S值出现的次数 / n个骰子所有点数的排列数转载 2015-07-29 21:20:23 · 6436 阅读 · 0 评论 -
给定入栈顺序,求解出栈顺序
#include #include using namespace std;void finn(const int n,int cur,vector&stac,vector&outL,int&count){ if((int)outL.size ()==n)//终点 { //如果需要对应的出栈顺序那么outL中即为所求 count++;转载 2015-08-05 10:45:02 · 1605 阅读 · 0 评论