华为0510 实习笔试

1、栈数据合并

向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设: 栈顶至栈底整数依次编号为n1、n2...nx, n1为最新压入的整数)

1.如果n1=n2,则n1、n2全部出栈,压入新数据m(m=2*n1)

2.如果n1=n2+...+ny(y的范围为[3,x]) ,则n1、n2...ny全部出栈,压入新数据m(m=2*n1)。

3.如果上述规则都不满足,则不做操作

如: 依次向栈压入6、1、2、3,当压入2时,栈顶至栈底依次为[2、1.6];当压入3时,3=2+1,3、2、1全部出栈,重新入栈整数6,此时栈顶至栈底依次为[6、6]; 6=6,两个6全部出栈,压入12,最终栈中只剩个元素12。

向栈中输入一串数字,请输出应用此规则后栈中最终存留的数字。

解答要求

时间限制: C/C++ 1000ms,其他语言: 2000ms

内存限制: C/C++ 256MB,其他语言: 512MB

输入

使用单个空格隔开的正整数的字符串,如"5 6 7 8”,左边的数字先入栈。

正整数大小为[1,2^31-1]。

正整数个数为[1,1000]。

输出

最终栈中存留的元素值,元素值使用单个空格隔开,如”8 7 6 5”,从左至右依次为栈顶至栈底的数字。

输入: 10 20 50 80 1 1
输出: 2 160
解释: 向栈压入80时,10+20+50=80,数据合并后入栈160,压入两个1时,合并为2,最终栈顶至栈底的数字为2和160。

//处理输入
arr = [int(c) for c in input().split(" ")]

//最终的结果栈
st = []

//主函数
def solve():
    //1,处理第一个逻辑,当栈最后两个数相等时,出栈之后求和进栈。
    if len(st) > 1 and st[-1] == st[-2]:
        num = st.pop()
        st.pop()
        st.append(2 * num)
        //由于可能处理完进栈跟前面相等,需重复处理。如1 1 1 1
        solve()

    //2,处理第二个逻辑,使用sum_记录前面栈的和
    elif len(st) >= 3:
        sum_ = 0
        for i in range(len(st) - 1):
            sum_ += st[len(st) - i - 2]
            if sum_ >= st[-1]:
                //等于将前面全部出栈
                if sum_ == st[-1]:
                    for _ in range(i+2): st.pop()
                    st.append(2 * sum_)
                    //如7 2 3 1 5 6
                    solve()
                //跳出循环
                break

for i in arr:
    st.append(i)
    solve()


while st:
    if len(st) > 1: print(st.pop(), end=" ")
    else: print(st.pop())

2、寻找密码串

1.截取M中的某一段数字x,和数字N进行k运算 (x k N),如果结果是一个所有位数相同的数,则这段数字有可能就是所找密码,例如x为222,N为3,k为",则计算结果是222*3=666,满足要求,x是所寻目标彩码串之一。

2.如果存在满足第1点的多种情况,则以计算结果最大的为准;

3.如果没有找到符合条件的密码串,则输出-1,表示密码串不存在

3.M的长度<100,N为正整数,且N<=9999999999,3<=所找密码长度<=12。k为+或-或中的一种,不考虑除法。为避免数据过于庞大,约定在乘法场景下,乘数最大为3位数。

解答要求

时间限制: C/C++ 1000ms,其他语言: 2000ms

内存限制: C/C++ 256MB,其他语言: 512MB

输入

提供加密后字符串M,秘钥数字N和运算符k,例如:

(加密字符串M) 748443217098

(秘钥数字N) 123

(运算符k) +

输出

满足计算结果所有位数相同,且计算结果最大的值。

例如:上述例子截取44321,和123相加,则为44321+123=44444,结果所有位的数字字符相同,包括个位数、十位数、百位数、千位数和万位数都是同一个数字字符4,且其值最大。

输入: 

6833023887793076998810418710
2211
-
输出: 9988
解释: 通过计算,8877-2211=6666,而9988-2211=7777,因为7777>6666,则目标密码串为9988。

//三行输入
a = input()
b = int(input())
c = input()

size = len(a)

#使用一个set来判断子字符串的数字是否都是一样的,都是一样的才进行之后的判断
def is_valid(s:str):
    return len(set(s)) == 1

ans = 0

#这个循环结果是各个子字符串
for i in range(size):
    for len in range(13):
        now = int(a[i:i + len + 1])
        #如果是加法将子字符串和b进行相加
        if c == '+':
            if is_valid(str(now + b)):
                ans = max(ans, now)
        #如果是减法将子字符串和b进行相加
        elif c == '-':
            if is_valid(str(now - b)):
                ans = max(ans, now)
        #如果是乘法
        else:
            if is_valid(str(now * b)):
                ans = max(ans, now)

#输出有点问题
print(ans)

3、微服务调用链路染色最短时间

在微服务架构中,一个请求可能会经过若干个服务节点,其所经过的路径,我们称之为请求调用链路。通常,我们会把一些服务治理相关的字段(例traceld),通过请求头的方式在整个链路中透传。当我们把有特定含义的请求头透传到整个链路,然后链路中每个服务会针对这个请求头做一些特殊的处理,我们把这种行为称之为链路染色。现给出在某一请求下其经过所有微服务节点的响应时长列表rsTimes,其中rsTimes[i]=(srcSerivce,dstService,rsTime),其中srcSerivce为调用方服务,dstService为被调用方服务,所有服务名称由一个1到n范围内的整数表示,rsTime为接口调用响应耗时。如果srcSerivce与dstService相同,则表示系统自身计算耗时。所以如果服务srcService到dstService的染色总时长为srcService到dstService响应时长+dstService计算耗时,现给出一个调用源头服务名称service,请给出以这个服务作为源头服务发起调用,最终可实现染色的服务个数,并给出这些服务全部完成染色的最短时间。

解答要求

时间限制: C/C++ 1000ms,其他语言: 2000ms

内存限制: C/C++ 256MB,其他语言: 512MB

输入

第一行表示服务节点总数m

第二行表示服务间调用响应耗时或者服务自身计算耗时rsTmes的长度n

接下来n行表示具体的服务间调用响应耗时或者服务自身计算耗时

rsTmes[i],每个数字间用空格隔开,比如 10 20 3,则表示10号服务调用20号服务的耗时为3秒

最后一行表示调用方源服务名称

提示:

1<=rsTimes.lenath<=5000 1<=srcSerivce<=100 1<=dstService<=100 1<=rsTime<=100

输出

输出分为两行,第一行输出最终可实现染色的微服务个数,第二行输出这些服务全部完成染色的最短时间

输入: 

5

9

1 1 3
1 2 6
1 3 10
3 3 8
2 2 7
2 4 12
2 5 20
5 5 5
4 4 9
1
输出: 

5

38
解释: 以服务1为起点计算最长耗时链路,分析可能会存在三条最大耗时链路,分别为1->3以及1->2->5以及1-2-4
第一条路径1->3路径下,总耗时为10(1->3耗时)+8(3自身耗时)=18秒
第二条路径1->2->5路径下,总耗时为6(1->2耗时)+7(2自身耗时)+20(2-5耗时)+5(5自身耗时)=38秒
第三条路径1->2->4路径下,总耗时为6(1->2耗时)+7(2自身耗时)+12(2->4耗时)+9(4自身耗时)=34秒
所以在此场景下,服务5完成染色的最短时间为38秒,为可以染色的所有服务节点的最长时间
最终输出结果分两行输出,最终1 2 3 4 5四个服务节点都可以实现染色,所以最终输出结果如下
5
38

输入: 

5
1 2 5
2 3 10
1 3 3
3 1 2
3 2 9
3

输出: 

3

7

解释:以服务3为起点计算最长耗时,3->1

import heapq
from collections import defaultdict
from math import inf

n = int(input())
m = int(input())

sysTime = defaultdict(int)
nxs = defaultdict(list)

for _ in range(m):
    s,d,t = map(int, input().split(" "))
    if s != d: nxs[s].append((d,t))
    else:
        sysTime[s] = t

start = int(input())

h = []
heapq.heappush(h, (0, start)) # 距离 节点
dis = [inf for _ in range(n+1)]
dis[start] = 0

while h:
    time, node = heapq.heappop(h)
    for nx, nxtime in nxs[node]:
        if dis[nx] > time + sysTime[nx]+ nxtime:
            heapq.heappush(h, (time + sysTime[nx]+ nxtime, nx))
            dis[nx] = min(dis[nx], time + sysTime[nx]+ nxtime)


cnt, res = 0, 0
for d in dis:
    if d != inf:
        cnt+=1
        res = max(res, d)

print(cnt)
print(res)

文章参考:万诺coding

### 关于华为暑期实习笔试题目 #### 中央空调管道维修问题 针对某商业楼中央空调管道老化导致漏水的情况,在统一翻修前需要处理天花板上的积水以防止其凹陷损坏。具体措施是在凹陷部分开设出水口进行引流,从而有效解决因长期积水造成的潜在损害[^1]。 #### 太阳能板发电收入优化问题 对于A地区的太阳能板布局规划而言,该区域被划分为 \(m \times n\) 个地块,并且已知每块土地每年通过安装太阳能板可以获得的具体收益。此信息由一个大小为\(m\times n\)的矩阵给出,其中包含了各个位置上预计可获得的年发电收入数据。面对这样的场景,可能存在的问题是如何合理安排这些资源来最大化整体效益或是找到某些特定条件下最优解等问题[^2]。 ```python def max_solar_income(income_matrix, condition): """ 计算满足给定条件下的最大太阳能板年发电总收入 :param income_matrix: 发电收入矩阵 (list of lists) :param condition: 特殊约束条件函数 (function),接受单个元素作为参数返回布尔值 :return: 最大总收金额 (int or float) """ total_income = sum( value for row in income_matrix for value in row if condition(value)) return total_income ``` #### 服务调用性能分析问题 在分布式系统环境中,不同组件之间的交互效率至关重要。假设存在一系列的服务请求时间记录`rsTimes[]`,其中每一项代表了一次跨服务间的通信延迟情况(例如:“10 20 3”意味着编号为10的服务向编号为20的服务发起一次RPC远程过程调用所花费的时间)。基于此类日志条目的统计特性来进行服务质量评估或瓶颈定位等工作就显得尤为必要了[^3]。 ```python from collections import defaultdict def analyze_service_performance(rs_times_strs): """ 分析各服务之间平均响应时间和最慢的一次调用 :param rs_times_strs: 字符串列表形式的服务间调用耗时 ["src dst time", ...] :returns: 平均响应时间字典 {service_id: avg_time}, 最慢调用元组 (slowest_call_src, slowest_call_dst, longest_time) """ call_records = [] service_latency_sum = defaultdict(int) service_call_count = defaultdict(int) for record in rs_times_strs: src, dst, latency = map(int, record.split()) call_records.append((src, dst, latency)) service_latency_sum[src] += latency service_call_count[src] += 1 average_latencies = { svc: service_latency_sum[svc]/service_call_count[svc] for svc in service_latency_sum.keys() } _, _, longest_time = max(call_records, key=lambda x:x[-1]) slowest_call_src, slowest_call_dst, _ = min(filter(lambda r:r[-1]==longest_time,call_records),key=lambda t:t[:2]) return dict(average_latencies), (slowest_call_src, slowest_call_dst, longest_time) # 示例输入输出 print(analyze_service_performance(["10 20 3","20 30 5"])) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值