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。请注意程序效率。
这道题目最简单的实现就是进行动态规划。算法思想:
定义二元函数函数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为两个字符串长度。
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;
}
欢迎大家提供上面题目的思路,感谢!