阿里巴巴笔试题_2014-8-29

大题:

1.      给定一个query和一个text,均由小写字母组成。要求在text中找出以同样的顺序连续出现在query中的最长连续字母序列的长度。例如, query为“acbac”,text为“acaccbabb”,那么text中的“cba”为最长的连续出现在query中的字母序列,因此,返回结果应该为其长度3。请注意程序效率。

解析:使用kmp算法,每次匹配完了,不用一次移动一个字母,缩短时间

   

 

2.      天猫双十一有积分换墨盒的活动,总共有50万台天猫魔盒(box),每个用户(user)可以用99个天猫积分(point)兑换一台魔盒,且每人限换一台。

请设计一套java接口实现下单(order)逻辑。

参考(但不局限于)下面的下单逻辑

  1. 创建订单
  2. 扣减用户积分
  3. 扣减魔盒库存
  4. 下单成功

同时请回答:

1.      数据库变结构如何设计,有哪些表,分别有什么作用?

2.      下单过程中哪些地方可能成为瓶颈?如何解决或者改善?

3.      是否会用到数据库事务,有哪些地方用到?如果不用数据库事务,如何保证数据的一致性。

解析:数据库设计,解决高并发访问

1)      数据库设计

天猫活动物品表(物品名<box>,物品描述,活动台数<50万>)   //用于记录做活动的物品,和台数

天猫用户表(用户名,用户积分,是否已购<0,1>)   //用于记录能够换购的用户

2)      接口设计:

Class UserDao{

Boolean cheakUser(user u);//判断是否已购,积分是否大于99

Void userPoint(user u); //换购成功,扣除积分

}

Class BoxDao{

    Void  rBox(); //魔盒减一

}

ClassOrderService{

   Boolean Cheak(user u);

   Void CreateOrder();

}

3)      下单时候的瓶颈和解决办法

技术层面:

瓶颈1:高并发访问? 解决:通过中转服务器将访问任务分发到不同的服务器上服务

瓶颈2:事务处理拖慢速度。解决:尽量最小化锁。

4)      事务,和数据库版本控制

A 在下订单时,需要事务处理几个操作。B 数据库修改point和box必须是事务的

不用事务,可是使用hibernate的版本控制,mysql数据库的版本控制。

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

解析:使用二叉树,将小于该节点的放在左边,大于该节点的放在右边。

#include<stdio.h>
#include<stdlib.h> 
const int MaxSize=100;
typedef int KeyType;
typedef struct node
{
KeyType key;
struct node *lchild,*rchild;
}BSTNode;
int InsertBST(BSTNode *&p,KeyType k)
{
if(p==NULL)
{
p=(BSTNode *)malloc(sizeof(BSTNode));
p->key=k;
p->lchild=p->rchild=NULL;
return 1;
}
else if(k==p->key)
return 0;
else if(k<p->key)
return InsertBST(p->lchild,k);
else 
return InsertBST(p->rchild,k);
}
BSTNode *CreateBST(KeyType A[],int n)
{
   BSTNode *bt=NULL;
   int i=0;
   while(i<n)
   {
   InsertBST(bt,A[i]);
   i++;
   }
   return bt;
}
BSTNode *SearchMin(BSTNode *bt)
{
    for(;bt->lchild;bt=bt->lchild);
return bt;
}
BSTNode *SearchMax(BSTNode *bt)
{
    for(;bt->rchild;bt=bt->rchild);
return bt;
}
int main(){
  int a[MaxSize],n,i,max,min;
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
 scanf("%d",&a[i]);
  }
  BSTNode *bt=CreateBST(a,n);
  min=SearchMin(bt)->key;
  max=SearchMax(bt)->key;
  printf("%d\n",max-min);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值