网易-前端-笔试
开放题1
开放题:某在线教育平台需开发课程报名功能,核心流程为用户选择课程后提交报名请求,系统需完成 3 个操作,扣减用户账户中的课程优惠券,若有。二、生成课程报名订单并写入订单库。三、向用户推送报名成功消息,通过消息队列发送。由于用平台用户量较大,采用微服务架构,用户账户服务、订单服务、消息服务分别为独立服务,且使用不同的数据库,账户库、订单库。请回答以下问题:
1、若不做特殊处理,上述流程可能出现哪些数据不一致的问题?请举例说明。至少两种场景,需描述具体体现象及影响。
2、为保障三个操作者最终一致性,可采用本地消息表加消息队列方案。请详细描述该方案在本题场景中的具体实现步骤,需包含各服务的核心逻辑、数据存储结构。
3、弱报名流程中突然出现消息队列、消息丢失问题,可能导致部分用户扣了优惠券但未生成订单,请设计一套异常检测与数据修复方案,确保用户权益不受损。
编程题1-4
题 1:模板字符串合法性判断
题干:设计模板渲染引擎,判断输入的模板字符串是否合法有效。模板引擎采用双花括号{{}}匹配方式,用于替换中间变量。
有效字符串需满足:
必须采用相邻双花括号方式进行匹配,并且要求是闭合的,例如{{a}}合法,{a}不合法;
双花括号之间必须有有效字符,不可以只包含空格;例如{{ }}不合法;
在双花括号之间存在有效字符的情况下,允许存在空格;例如{{ a }}合法;
允许出现多个双花括号匹配,但不允许嵌套,例如{{{a}}b}}不合法,{{a}}{{b}}合法。
备注:
每次仅输入一个模板字符串;
如果不包含任何双花括号,认定为有效模板。
输入描述:输入为需要判断有效性的字符串模板。
输出描述:输出是否为有效字符串,布尔值,有效返回true,无效返回false。
示例:
输入this is a {{question}},输出true;
输入this is a {question},输出false;
输入this is {{}a{question},输出false;
输入this is a {qu{estion},输出false;
输入{{}},输出false(说明:不允许存在双花括号里是空字符串,或只有空格);
输入{{a }},输出true(说明:在花括号里有字符的情况下,允许包含空格)。
题 2:最长公共子序列
题干:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列,返回 0。
子序列定义:一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
输入描述:两个字符串,text1和text2。
输出描述:返回这两个字符串的最长公共子序列的长度。
补充说明:
1 <= text1.length, text2.length <= 1000;
text1 和 text2 仅由小写英文字符组成;
两个字符串的公共子序列是这两个字符串所共同拥有的子序列。例如,"ace"是"abcde"的子序列,但"aec"不是"abcde"的子序列。
示例:
输入abcde、ace,输出3。
题 3:仓库出租与商品倒卖最大收益
题干:小伊家里有一个仓库库房,库房可出租,每日租金价格固定为m元;小伊可倒卖商品赚差价,选择合适日期买入,占用库房储存后再选择合适日期卖出以获取最大收益。买卖商品当天和存放商品期间仓库不可出租,买一次或卖一次的运输成本为k元,除买卖当天和存放商品期间之外的所有日期每天都稳定可以出租出去,不存在同一天买入又卖出的情况。
输入描述:
第一行m(0<m<1万);
第二行k(0<k<1万);
第三行n(0<n<1万);
第四行n个数字代表未来n天每一天的商品交易价格(0<每天的商品交易价格<1亿)。
输出描述:n天后的收入最大值。
补充说明:
不限制先买入再卖出的交易次数;
小伊本金充足,不考虑挣够本金再买入商品,允许一开始就买入商品。
示例:
输入:
10
30
7
100 200 120 110 100 400 500
输出:400
说明:日租金收入m=10,商品运费k=30,未来 7 天商品价格变化:100 200 120 110 100 400 500,则未来 7 天最大收益为 400。计算过程如下:
第一天买入商品,第二天卖出商品,占用两天仓库,获得商品倒卖收益200 - 100 - 30 * 2 = 40;
第三天和第四天仓库未占用,出租获得收益10 * 2 = 20;
第五天买入商品,第七天卖出商品,占用三天仓库,获得商品倒卖收益500 - 100 - 30 * 2 = 340;
因此未来七天可获得最大收益为40 + 20 + 340 = 400。
题 4:村落洪水最短撤离时间
题干:在偏远山区有一片 n×n 的村落群,每个村落 (i,j) 海拔为 grid[i][j] 米。洪水水位每小时上涨 1 米,第 t 小时时水位为 t 米。需从西北角起始村落 (0,0) 出发,尽快赶到东南角安全避难所 (n-1,n-1)。仅当两个相邻村落(上下左右四个方向)的海拔都被当前水位淹没时,才能在它们之间移动。计算从起始村落到达安全避难所的最短撤离时间(即最早能出发并成功抵达的小时数 t)。
输入描述:
第一行输入为 N,表示 grid 的大小;
之后 N 行输入分别表示 grid 中村落的海拔。
输出描述:输出一个整数,表示最短撤离时间。
补充说明:
n == grid.length;
n == grid[i].length;
1 <= n <= 1000;
0 <= grid[i][j] < n*n;
grid[i][j] 中每个值均无重复。
示例:
示例 1:
输入:
2
0 2
1 3
输出:3
示例 2:
输入:
5
0 1 2 3 4
24 23 22 21 5
12 13 14 15 16
11 17 18 19 20
10 9 8 7 6
输出:16
#面经#