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;
}


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


 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值