最佳人选 | 豆包MarsCode AI刷题

141 阅读3分钟

今天我们来做题

最佳人选

题目如下:

某特种部队采用了一套性格密码机制来筛选执行特定任务的最佳士兵,该机制的规则如下:

每个人的性格可以通过 M 个维度来描述,每个维度分为 A, B, C, D, E 五种类型。 同一维度内,字母距离越近,性格类型差异越小,匹配程度越高。比如,A 和 B 的差异为 1,A 和 D 的差异为 3。 其中 AE、BD、CE、BE 为不相容性格类型,差异值设为无穷大(无法匹配)。 如果某一维度存在不相容性格类型,则表示两个士兵性格完全不匹配。 对于符合匹配条件的士兵,差异值总和越小表示匹配程度越高。 现在,有一个重要的机密任务,要求找到最匹配该任务所需性格密码的士兵。你需要编写一个算法,帮助部队找到符合条件的最佳人选。

m 表示性格密码的维度。 n 表示备选特种兵的数量。 target 是代表任务的性格密码。 array 是一个包含 n 个元素的列表,每个元素为 M 位的性格密码。

image.png

一眼打表,好,我们来打表

#打个表先
diff_matrix = {
        'A': {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': INF},
        'B': {'A': 1, 'B': 0, 'C': 1, 'D': INF, 'E': INF},
        'C': {'A': 2, 'B': 1, 'C': 0, 'D': 1, 'E': INF},
        'D': {'A': 3, 'B': INF, 'C': 1, 'D': 0, 'E': 1},
        'E': {'A': INF, 'B': INF, 'C': INF, 'D': 1, 'E': 0}
    }

打完了,按部就班写对比,完整如下

def solution(m, n, target, array):
    # 定义不相容性格类型的差异值为无穷大
    INF = float('inf')
    
    # 定义性格类型之间的差异值
    diff_matrix = {
        'A': {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': INF},
        'B': {'A': 1, 'B': 0, 'C': 1, 'D': INF, 'E': INF},
        'C': {'A': 2, 'B': 1, 'C': 0, 'D': 1, 'E': INF},
        'D': {'A': 3, 'B': INF, 'C': 1, 'D': 0, 'E': 1},
        'E': {'A': INF, 'B': INF, 'C': INF, 'D': 1, 'E': 0}
    }
    
    # 计算两个性格密码之间的差异值
    def calculate_diff(password1, password2):
        total_diff = 0
        for i in range(m):
            char1 = password1[i]
            char2 = password2[i]
            if diff_matrix[char1][char2] == INF:
                return INF  # 如果存在不相容性格类型,直接返回无穷大
            total_diff += diff_matrix[char1][char2]
        return total_diff
    
    # 初始化最小差异值和最佳人选
    min_diff = INF
    best_candidate = None
    
    # 遍历所有候选士兵
    for candidate in array:
        diff = calculate_diff(target, candidate)
        if diff < min_diff:
            min_diff = diff
            best_candidate = candidate
    
    return best_candidate if min_diff != INF else None

好,提交!

出问题了,看看怎么个事

image.png

啊咧,我是返回的None啊,怎么不对哩

等等,不会要字符串吧

#修改返回
    return best_candidate if min_diff != INF else 'None'

提交!

又出问题了?

image.png

什么,相同的数值要返回多个?这么重要的事你案例不说?

妹说就是妹写

行吧

def solution(m, n, target, array):
    INF = float('inf')
    
    diff_matrix = {
        'A': {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': INF},
        'B': {'A': 1, 'B': 0, 'C': 1, 'D': INF, 'E': INF},
        'C': {'A': 2, 'B': 1, 'C': 0, 'D': 1, 'E': INF},
        'D': {'A': 3, 'B': INF, 'C': 1, 'D': 0, 'E': 1},
        'E': {'A': INF, 'B': INF, 'C': INF, 'D': 1, 'E': 0}
    }
    
    def calculate_diff(password1, password2):
        total_diff = 0
        for i in range(m):
            char1 = password1[i]
            char2 = password2[i]
            if diff_matrix[char1][char2] == INF:
                return INF  
            total_diff += diff_matrix[char1][char2]
        return total_diff
    
    min_diff = INF
    best_candidates = []
    
    for candidate in array:
        diff = calculate_diff(target, candidate)
        if diff < min_diff:
            min_diff = diff
            best_candidates = [candidate]
        elif diff == min_diff:
            best_candidates.append(candidate)
    #注意要把返回值改为字符串
    return ' '.join(best_candidates) if min_diff != INF else 'None'

ok,easy

今天就到这里,大家明天见