大题:
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. 是否会用到数据库事务,有哪些地方用到?如果不用数据库事务,如何保证数据的一致性。
解析:数据库设计,解决高并发访问
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);
}