Bootstrap

华为机试题

2021.7.7校招

第一题 

给定N个任务,每个任务有SLA时间和对应积分,在SLA时间前完成才能获得积分,每个任务完成只需一小时。求最大能获得的积分。

7
1 6
1 7
3 2
3 1
2 4
2 5
6 1
积分是15,先做1-7,再做2-5,在做3-2,在做6-1.
def execute(listN):
    listN.sort()
    # print(listN)
    res = []
    count = 0
    for i in listN:
        if count < i[0]:
            res.append(i[1])
            count += 1
        elif count == i[0] and i[1] > min(res):
            res.pop(res.index(min(res)))
            res.append(i[1])  # 替换,所以不加1
        else:
            res.append(i[1])
            count += 1
    # print(res)
    print(sum(res))
    
listN = [[1,6], [1,7], [3,25], [3,8], [4,25], [2,5], [3,8]]
# listN = [[1,6], [1,7], [3,25], [3,8], [4,25], [2,5], [3,8]]
execute(listN)

第二题

// [1,2,15]
// [1,3,14]
// [3,4,9]
// 4
// 1

输出23, 路线1-3-4.虽然不经过2,但是1可以到2,所以算能到达。
输入如上,前三行分别代表景点1到景点2之间有路,距离为15,景点1到景点3之间有路,距离为14,景点3到景点4之间有路,距离为9。
接下来输入一共有多少个景点,下一行是起始景点。问是否能逛完,可以的话求最长路径,否则输出-1.景点数小于100,路径长度小于100,两个景点间路径数小于5000.
这个输入处理麻烦,因为格式不一致而且不确定有多少

空瓶子换饮料 

def traceback(sum, res):
    
    if res < 2:
        return sum
    if res == 2:
        res += 1  # 借1个
    sum += res//3
    res = res//3 + res%3
    # print(sum, res)
    return traceback(sum, res)

def func(N):
    for i in N:
        sum = 0
        res = i
        sum = traceback(sum, res)
        print(sum)
        
        
if __name__ == "__main__":
    N = []
    while True:
        try:
            number = int(input())
            if number == 0:
                break
            N.append(number)
        except EOFError:
            break
    func(N)

415. 字符串相加

请设计一个算法完成两个超长正整数的加法。

输入描述:

输入两个字符串数字

输出描述:

输出相加后的结果,string型

class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        length = len(num2) if len(num1) < len(num2) else len(num1)
        x = (' '.join(num1)).split(' ')
        y = (' '.join(num2)).split(' ')

        # 处理长度
        if len(num1) < length:
            for i in range(length-len(num1)):
                x.insert(0, 0)
        if len(num2) < length:
            for i in range(length-len(num2)):
                y.insert(0, 0)
        res = ''
        for i in range(-1, -(length)-1, -1):
            if (int(x[i]) + int(y[i])) >= 10:
                res += str((int(x[i]) + int(y[i]))%10)
                if i-1 >= -len(x):   # 能进位则进位
                    x[i-1] = int(x[i-1]) + 1
                else:  # 不能进位则补位
                    res += '1'
            else:
                res += str(int(x[i]) + int(y[i]))
                
        res = res[::-1]
        return res

逛动物园-Floyd

"""
弗洛伊德算法
https://blog.csdn.net/ustbbsy/article/details/102556540

描述:Jack周日去动物园看“猩猩”,为了直达目的地,Jack想根据动物园地图计算从园区入口到“猩猩”馆的最短路径是多长?

输入: 输入中第一行第一个数为动物园展览馆总数n(包括0号馆),第二个数为“猩猩”馆的数字编号(入口编号为0号馆)。后面的输入是一个n×n的矩阵,表示动物园地图,其中,矩阵节点之间用一个空格隔开,矩阵节点的值n[i][j]代表i号馆到j号馆的距离,0表示馆间不通或无效路径。

输入: 
5 4 
0 7 3 10 15 
7 0 5 13 12 
3 5 0 5 10 
10 13 5 0 11 
15 12 10 11 0 
输出 :13(园区入口到“猩猩“馆的最短路径。)

弗洛伊德与迪杰斯特拉算法的区别:
1.Floyd算法是求任意两点之间的距离,是多源最短路,而Dijkstra(迪杰斯特拉)算法是求一个顶点到其他所有顶点的最短路径,是单源最短路。
2.Floyd算法可以算带负权的,而Dijkstra(迪杰斯特拉)算法是不可以算带负权的。并且Floyd算法不能算负权回路。
3.Dijkstra(迪杰斯特拉)算法时间复杂度一般是o(n^2),Floyd算法时间复杂度是o(n^3),Dijkstra(迪杰斯特拉)算法比Floyd算法块。
4.Floyd算法属于动态规划,Dijkstra(迪杰斯特拉)算法属于贪心算法。

"""
def execute(dp):
    for k in range(n):
        for i in range(n):
            for j in range(n):
                if(dp[i
;