1. 当使用美团团购购买套餐后,后台发生了哪些业务流程?
参考答案:
1.客户端向服务器发起套餐购买,并带上用户ID、商品ID、token等信息。
2.服务器收到客户端发送的请求,校验用户信息以及根据商品ID查询库存情况,并将库存结果返回客户端。
3.客户端收到服务器返回的库存结果,库存不足提示库存信息,库存充足选择调起支付平台的支付SDK,并向服务器发起支付请求。
4.服务器收到客户端的请求后,校验用户信息以及商品ID信息,校验通过,服务器通知支付平台后台生成预支付订单号。支付平台后台将生成的预支付订单信息,预支付订单号返回美团服务器后台。美团服务器后台收到信息,生成带签名的客户端支付信息返回客户端。
5.客户端输入密码确认支付、支付平台返回支付结果给客户端。
6.客户端同步支付结果到美团服务器后台,上传订单信息、签名、用户信息等。
7.服务器根据客户端上传的订单号以及订单信息到支付宝或微信服务后台验单
8.验单通过,更新库存信息,更新用户账户信息,更新商品信息,更新订单管理记录,并将结果返回客户端和商家
9.客户端、商家后台订单信息及时更新,提示购买成功,并生成对应的订单记录。
2. 当用户第一次打开并登陆外卖App后会看到App的首页,打开和登陆外卖App的过程中发生了哪些具体的动作行为以及可能导致的缺陷?
参考答案:
一、首次打开App,App会进行应用的初始化和相关数据的加载。可能的缺陷包括启动闪退,打开过程加载时间过长,App启动过程的界面显示错误
二、登陆App的过程中会进行用户名和密码的校验,以及根据分控策略阻止异常账号的登陆。可能的缺陷包括用户名密码未加密存储和显示,账户登陆异常信息提示错误
三、App首页加载:用户位置定位,根据用户位置展示附近商圈的外卖门店信息。可能的缺陷包括用户位置定位失败或者错误,外卖门店信息加载失败和错误,网络加载失败等
3. 当使用美团App扫描美团单车上的二维码后,发生了什么?
参考答案:
一、二维码识别:开锁url、车辆id等
二、网络通信和页面渲染
三、业务逻辑判断:车锁状态正常、账户余额充足、用户身份正常、用户GPS位置正常
四、执行开锁、计费开始
4. 当前的移动互联网产品,大都为以移动App形式呈现的一个典型的Client/Server或客户/服务器的体系结构:用户通过UI操作触发移动用户端发送一个网络请求给后台服务,众多后台微服务以及各种数据存储相互协作,得到用户想要的信息,并发送回移动应用端。移动端根据接收到的响应,展示不同的信息给用户。
假设当你在移动App中,点击一个按钮,比方说,美团的登陆按钮,如果从移动App的界面看起来,任何事情都没有发生,你将如何分析定位问题大致发生在什么地方?
参考答案:
界面未给出响应的原因:
程序问题:
1、按钮的监听事件未正确调用,或者干脆就没有添加监听
2、监听确认被调用,但监听过程出现错误或异常,例如参数传输失败。
3、前端调用接口错误,如后端出现运行时异常,没有给出相应的提示消息
设备问题:
1、网络延迟,响应没有及时出现,超时
2、手机卡顿,出现死机现象
3、响应被中断
5. 将给定的字符串,按照规则删除字符,输出删除后的字符串。删除规则为:相同字符连续,则删除,如”aaaab”删除后的字符串为”b” 。注:仅是单个字符连续才删除,如babababa则不能删除;
#include<iostream>
using namespace std;
int main() {
string str;
while (cin >> str) {
int len = str.length();
if (len == 1) {
cout << str << endl;
continue;
}
int j = 0;
for (int i = 0; i < len; i++) {
if (str[i - 1] != str[i]&&str[i]!=str[i+1]) {
cout << str[i];
j = 1;
}
}
if (j == 0) {
cout << "no" ;
}
cout << endl;
}
return 0;
}
6. 小美和小团在玩一个游戏,小美任意给出一个大字符串str1以及一个独立的小字符串str2,小团需要从这个大字符串str1里找到包含独立小字符串str2中所有字符的最小子字符串str3;
例如,小美给出一个大字符串"meituan2019"和一个子字符串"i2t",那么小团给出的答案就应该是"ituan2";
需要注意:
1、str1中有可能没有完整包含str2所有字符的情况,此时返回"",即为空字符串;
2、str1不会为空,但str2有可能为空,此时返回整个str1;
3、str2可能存在重复的字符,此时str3需要包含相等数量该字符;
7.给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
8. 一个班级男生和女生数量相同,老师要求男生女生进行排队,男生全部排在队列前面,女生紧跟着排在男生队列后面,形成一个队列,现在要求男生女生交叉排列并且第一位是男生,且每个人在在原队列中的顺序不变,如何来做?
要求:
交叉前:队列[男1,男2,男3,男4…男n,女1,女2,女3,女4…女n]
交叉后:队列[男1,女1,男2,女2,男3,女3,男4,女4…男n,女n]
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int men[n];
int women[n];
for(int i=0;i<n;i++){
cin>>men[i];
}
for(int i=0;i<n;i++){
cin>>women[i];
}
for(int i=0;i<n;i++){
cout<<men[i]<<endl;
cout<<women[i]<<endl;
}
return 0;
}
9. 美团外卖是知名的外卖平台,现在有一名新入职的外卖小哥。请你给他写一段程序根据外卖地图和交通拥堵情况,告诉他从“配送点”V0,到各个目的地的最短配送距离。其中拥堵程度可以与路径参数直接相加,例如:V0点拥堵,拥堵系数是2,那么在地图上V0点的3条线路的参数都要加2,由原来的1、2、7变为3、4、9再进行。
路径规划计算。路径参数越大代表路程越长。
#include<iostream>
#define MAX 100
#define INF 9999
using namespace std;
void dijkstra(int mMatrix[][6], int mVexNum, int vs, int prev[], int dist[]);
int main() {
int graph[6][6] = { {0, 1, 2, 7, 9999, 9999},
{1, 0, 2, 9999, 5, 4},
{2, 2, 0, 4, 4, 9999},
{7, 9999, 4, 0, 6, 9999},
{9999, 5, 4, 6, 0, 3},
{9999, 4, 9999, 9999, 3, 0}
};
int eVexNum = 6;
int prev[MAX] = { 0 };
int dist[MAX] = { 0 };
dijkstra(graph, eVexNum, 0, prev, dist);
return 0;
}
/*
* Dijkstra最短路径。
* 即,统计图中"顶点vs"到其它各个顶点的最短路径。
*
* 参数说明:
* vs -- 起始顶点(start vertex)。即计算"顶点vs"到其它顶点的最短路径。
* prev -- 前驱顶点数组。即,prev[i]的值是"顶点vs"到"顶点i"的最短路径所经历的全部顶点中,位于"顶点i"之前的那个顶点。
* dist -- 长度数组。即,dist[i]是"顶点vs"到"顶点i"的最短路径的长度。
*/
void dijkstra(int mMatrix[][6],int mVexNum,int vs, int prev[], int dist[])
{
int i, j, k;
int min;
int tmp;
int flag[MAX]; // flag[i]=1表示"顶点vs"到"顶点i"的最短路径已成功获取。
char mVexs[] = { '0', '1', '2', '3', '4', '5', '6' };
int end, block, blockCount;
cin >> end >> block >> blockCount;
for (int i = 0; i < 6; i++) {
if(mMatrix[block][i]!=0|| mMatrix[block][i]!=INF)
mMatrix[block][i] += blockCount;
if(mMatrix[i][block] != 0 || mMatrix[i][block] != INF)
mMatrix[i][block] += blockCount;
}
// 初始化
for (i = 0; i < mVexNum; i++)
{
flag[i] = 0; // 顶点i的最短路径还没获取到。
prev[i] = 0; // 顶点i的前驱顶点为0。
dist[i] = mMatrix[vs][i]; // 顶点i的最短路径为"顶点vs"到"顶点i"的权。
}
// 对"顶点vs"自身进行初始化
flag[vs] = 1;
dist[vs] = 0;
// 遍历mVexNum-1次;每次找出一个顶点的最短路径。
for (i = 1; i < mVexNum; i++)
{
// 寻找当前最小的路径;
// 即,在未获取最短路径的顶点中,找到离vs最近的顶点(k)。
min = INF;
for (j = 0; j < mVexNum; j++)
{
if (flag[j] == 0 && dist[j] < min)
{
min = dist[j];
k = j;
}
}
// 标记"顶点k"为已经获取到最短路径
flag[k] = 1;
// 修正当前最短路径和前驱顶点
// 即,当已经"顶点k的最短路径"之后,更新"未获取最短路径的顶点的最短路径和前驱顶点"。
for (j = 0; j < mVexNum; j++)
{
tmp = (mMatrix[k][j] == INF ? INF : (min + mMatrix[k][j]));
if (flag[j] == 0 && (tmp < dist[j]))
{
dist[j] = tmp;
prev[j] = k;
}
}
}
cout << dist[end] << endl;
打印dijkstra最短路径的结果
//cout << "dijkstra(" << mVexs[vs] << "): " << endl;
//for (i = 0; i < mVexNum; i++)
// cout << " shortest(" << mVexs[vs] << ", " << mVexs[i] << ")=" << dist[i] << endl;
}