华为 暑期实习 2023.05.10 机试题目与题解
1、空栈压数
向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设:栈顶至栈底整数依次编号为\(n_1,n_2,\dots,n_x\),\(n_1\)为最新压入的整数)
如果\(n_1=n_2\),则\(n_1\)、\(n_2\)全部出栈,压入新数据\(m(m=2∗n_1)\)。
如果\(n_1=n_2+\dots+n_y\)(\(y\)的范围为\([3,x]\)),则\(n_1,n_2,\dots,n_y\)全部出栈,压入新数据\(m(m=2∗n_1)\)。
如果上述规则都不满足,则不做操作。
如: 依次向栈压入6、1、2、3,当压入2时,栈顶至栈底依次为[2,1,6]; 当压入3时,3=2+1,3、2、1全部出栈,重新入栈整数6,此时栈顶至栈底依次为[6,6]; 6=6,两个6全部出栈,压入12,最终栈中只剩个元素12。 向栈中输入一串数字,请输出应用此规则后栈中最终存留的数字。
输入
使用单个空格隔开的正整数的字符串,如"5 6 7 8",左边的数字先入栈。
正整数大小为\([1,2^{31}−1]\)。
正整数个数为\([1,1000]\)。
输出
最终栈中存留的元素值,元素值使用单个空格隔开,如"8 7 6 5",从左至右依次为栈顶至栈底的数字。
样例
1 | 输入: |
解答
直接使用数组模拟这个栈的行为。在每次添加前,先判断是否存在一个后缀和(假设下标为\(j\))恰好为下一个输入值\(x\),如果存在\(j\),那么将\(j\)之后的元素全部弹出即可,并将\(2x\)入栈(这里使用的是数组模拟,直接改动最后一个元素的下标即可),否则将\(x\)直接入栈。
代码
1 |
|
2、解密敌占区传出字符串
敌占区地下工作者冒死提供了加密后的字符串,需要你根据预先定好的方式进行解密,得到其中真正的密码。加密后字符串\(M\)是由\(0\sim9\)这10个数字组成的字符串,你手上是一个给定秘钥数字N和一个运算符k(加减乘中的一个),需要按如下规则找出直正的密码。
截取M中的某一段数字x,和数字N进行k运算(x k N),如果结果是一个所有位数相同的数,则这段数字有可能就是所找密码,例如x为222,N为3,k为,则计算结果是2223=666,满足要求,x是所寻目标密码串之一。
如果存在满足第1点的多种情况,则以计算结果最大的为准;
如果没有找到符合条件的密码串,则输出-1,表示密码串不存在;
M的长度<100,N为正整数,且N<=9999999999,3<=所找密码长度<=12。k为+或-或*中的一种,不考虑除法。
为避免数据过于庞大,约定在乘法场景下,乘数最大为3位数。
输入
提供加密后字符串M,秘钥数字N和运算符k,例如: (加密字符串M)748443217098 (秘钥数字N)123 (运算符k)+
输出
满足计算结果所有位数相同,且计算结果最大的值。 例如:上述例子截取44321,和123相加,则为44321+123=44444,结果所有位的数字字符相同,包括个位数、十位数、百位数、千位数和万位数都是同一个数字字符4,且其值最大。 (目标字符串)44321
样例
1 | 输入: |
解答
枚举\(M\)中所有长度在\(3\)到\(12\)之间的所有子串得到\(x\),并且使用eval
函数方便地计算得到计算结果\(w\),再将其转换成字符串并判断是否结果为同一个数位即可。
代码
1 | m, n, op = input(), input(), input() |
3、最短染色时间
在微服务架构中,一个请求可能会经过若干个服务节点,其所经过的路径,我们称之为请求调用链路。
通常,我们会把一些服务治理相关的字段(例:traceld),通过请求头的方式在整个链路中透传。
当我们把有特定含义的请求头透传到整个链路,然后链路中每个服务会针对这个请求头做一些特殊的处理,我们把这种行为称之为链路染色。
现给出在某一请求下其经过所有微服务节点的响应时长列表rsTimes,其中rsTimes[i]=(srcSerivce,dstService,rsTime),其中srcSerivce为调用方服务,dstService为被调用方服务,所有服务名称由一个1到n范围内的整数表示,rsTime为接口调用响应耗时。
如果srcSerivce与dstService相同,则表示系统自身计算耗时。
所以如果服务srcService到dstService的染色总时长为srcService到dstService响应时长+dstService计算耗时,现给出一个调用源头服务名称service,请给出以这个服务作为源头服务发起调用,最终可实现染色的服务个数,并给出这些服务全部完成染色的最短时间。
输入
第一行表示服务节点总数m; 第二行表示服务间调用响应耗时或者服务自身计算耗时rsTmes的长度n; 接下来n行表示具体的服务间调用响应耗时或者服务自身计算耗时; rsTmes[i],每个数字间用空格隔开,比如10 20 3,则表示10号服务调用20号服务的耗时为3秒; 最后一行表示调用方源服务名称
输出
输出分为两行,第一行输出最终可实现染色的微服务个数,第二行输出这些服务全部完成染色的最短时间。
样例
1 | 输入: |
提示
1<=rsTimes.length<=5000
1<=srcSerivce<=100
1<=dstService<=100
1<=rsTime<=100
解答
由于点的数量比较少,可以考虑使用不带堆优化的Dijkstra算法来求解最短路来求解最短路问题。需要注意的地方只有一个:
- 遇到自环,需要额外用一个变量\(c\)进行存储。当使用某一条边对\(v\)进行松弛时,需要将\(c[v]\)加上这条边的边权中。
最终只需要统计能够可达的节点数以及最大的最短路距离即可。
代码
1 |
|