2015阿里巴巴秋招在线笔试题

1.淘宝网(www.taobao.com)与阿里巴巴网(www.alibaba.com)是阿里巴巴集团下的两个独立站点,如果淘宝网每天的独立訪客数在亿以上(以IP计),阿里巴巴网每天的独立訪客数在千万以上(以IP计)。这两个站点有各自的浏览日志。记录了訪客在本站点上的浏览记录。如IP、訪问时间、訪问页面的URL等(注:一个IP在某天可能訪问多个页面);现有这两个站点某天的浏览日志文件各一份。要计算在该天既訪问过淘宝网又訪问过阿里巴巴站点的独立訪客数大约是多少。请给出你能想到的方案(可多个)。

关于海量数据处理问题。July在这篇博文进行非常好的总结:http://blog.csdn.net/v_july_v/article/details/6279498

而这个问题类似上面网址提到第五个问题。

 

2.给定一个query和一个text,均由小写字母组成。

要求在text中找出以相同的顺序连续出如今query中的最长连续字母序列的长度。

比如, query为“acbac”,text为“acaccbabb”。那么text中的“cba”为最长的连续出如今query中的字母序列,因此,返回结果应该为其长度3。请注意程序效率。

这道题目最简单的实现就是进行动态规划。

算法思想:

求字符串str1,str2的最长公共子串的长度。 
定义二元函数函数f(m,n):分别以str1[m],str2[n]结尾的连续公共子串的长度 
而对于f(m+1,n+1) 有下面两种情况 
1.str1[m+1] != str2[n+1],则有f(m+1,n+1) =0
2.str1[m+1] == str2[n+1],则有f(m+1,n+1) = f(m,n) + 1 
另外f(0,j) = 0(j>=0)    f(j,0) = 0 (j>=0) 时间复杂度为 O(M*N) M,N为两个字符串长度。
上述是基本实现算法。假设想进行优化能够利用后缀树数据结构:时间复杂度O(M+N) http://blog.csdn.net/nomad2/article/details/6404196

3.写一个函数,输入一个二叉树。树中每一个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。


数据结构定义:

typedef struct BSTreeNode{
	int num;
	BSTreeNode* leftChild;
	BSTreeNode* rightChild;

}*TreeNode;


我的思路是:非递归的中序遍历树,记录最大最小值,返回两个节点间最大差值。

//非递归的中序遍历,通过遍历数组。用Max记录最大值,用Min记录最小值,求得两者差值
void inorderTraverse(TreeNode root)
{

	stack<TreeNode>sta;
	TreeNode p=root;
	int Max = -2147483648 ;
	int Min = 2147483647;
	while (p||sta.size())
	{
		if (p)
		{
			sta.push(p);
			p=p->leftChild;
		}
		else
		{
			p=sta.top();
			// 更新最大最小值
			if(p->num>Max){
				Max = p->num;
			}
			if(p->num<Min){
				Min = p->num;
			}
			cout<<p->num<<" ";
			sta.pop();
			p=p->rightChild;
		}
	}
	cout<<"输出相差最大两个结点差值:"<<Max-Min<<endl;
}


欢迎大家提供上面题目的思路,感谢!微笑


 

 

 

posted @ 2016-02-21 13:02  phlsheji  阅读(312)  评论(0编辑  收藏  举报