2015阿里秋招在线笔试附加题-数据研发工程师
20个选择,有好多行测题,老长一个,读都读晕了。好像好记的几个专业题
1.给出二叉树的先序遍历为ACDEFHGB,中序遍历DECAHFBG。求后序遍历
答案:EDCHBGFA
2.甲,乙玩硬币游戏,分出胜负时停止,出现第一次为正面第二次为反面时甲胜,出现连续两次反面时乙胜,求甲胜的概率
答:假设用A,B表示正反两面。前两次抛硬币可能为AA,AB,BA,BB。概率为1/4,为AB时甲胜,为BB时乙胜。出现AA或BA时继续第三次抛,第三次可能为A或B,概率都为1/2。此时前面两种情况第二次出现的都是A,概率为1/2,故第二次和第三次为AB时甲胜,为AA时继续抛硬币。。。此后甲胜概率都为1/2,以后乙都不可能胜,故乙只能是前两次出现BB的时候胜,概率为1/4,所以甲胜的概率为1-1/4=3/4
3.两趟公家车10分钟一趟,第一辆分钟为2时发车,第二辆分钟为8时发车,求小命上第一辆车的概率
4.鹰策略和鸽子策略
.。。。。。。
待补充
附加题
第一题:这个就是求最长公共子串
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int LCS(const string &str1,const string &str2)
{
int xlen=str1.size(); //横向长度
vector<int> tmp(xlen); //保存矩阵的上一行
vector<int> arr(tmp); //当前行
int ylen=str2.size(); //纵向长度
int maxele=0; //矩阵元素中的最大值
int pos=0; //矩阵元素最大值出现在第几列
for(int i=0;i<ylen;i++){
string s=str2.substr(i,1);
arr.assign(xlen,0); //数组清0
for(int j=0;j<xlen;j++){
if(str1.compare(j,1,s)==0){
if(j==0)
arr[j]=1;
else
arr[j]=tmp[j-1]+1;
if(arr[j]>maxele){
maxele=arr[j];
pos=j;
}
}
}
tmp.assign(arr.begin(),arr.end());
}
return maxele;
}
int main()
{
string query;
string text;
cin>>query>>text;
cout<<LCS(query,text)<<endl;
return 0;
}
第二题:这个题目我感觉有歧义,是求结点距离最大的两结点的差值还是指求树中结点最大最小的差值呢?
我提交的是最大最小的差值
struct TreeNode
{
int data;
TreeNode *pLeft;
TreeNode *pRight;
int nMaxLeft;
int nMaxRight;
};
int max=INT_MIN;
int min=INT_MAX;
int getMax(TreeNode *pRoot)
{
if (pRoot!=NULL)
{
if (pRoot->data>max)
{
max=pRoot->data;
}
if (pRoot->data<min)
{
min=pRoot->data;
}
getMax(pRoot->pLeft);
getMax(pRoot->pRight);
}
return max-min;
}
第三题:我的想法是一个IP对应一个独立客户。因此首先找出这两个网站的IP,IP出现多次只留一个,然后再求出这两个网站共有的IP数就是所求答案