寻找最大葫芦问题解题思路 | 豆包MarsCode AI 刷题

69 阅读4分钟

今天做了三个题,但其中一个问题依然未能解决,在寻找最大葫芦的问题中,我首先利用了

  • value_map 字典:这里定义了一个字典来映射每张牌面值到对应的数值。按照题目的要求,A 的值为 1,K 为 13,Q 为 12,J 为 11,依此类推到 2 为 2。

  • numeric_array:将输入的牌面值转换为对应的数字形式。我们遍历 array 中的每一张牌,并用 value_map 字典进行转换。

  • Counter:使用 Counter 来统计每个牌面值的出现次数。

  • 找到三张和两张相同牌:分别将可以组成三张相同牌和两张相同牌的牌面值收集到列表中。

  • 排序:按照降序排序 three_of_a_kindtwo_of_a_kind 列表,优先选择较大的牌面值。

  • 组合和比较:遍历所有可能的三张和两张组合,计算它们的总和并检查是否满足 max_sum 限制,同时按照优先顺序选择更大的组合。

  • 输出结果:如果找到了符合条件的组合,则返回 [三张相同牌, 两张相同牌];如果没有找到,则返回 [0, 0]

但是结果仍然出现错误,因此我做出了如下调整:

不直接使用 total_value = triplet_value * 3 + pair_value * 2 来计算具体的牌面数值,而是通过比较找到的三个相同值(triplet)和两个相同值(pair)之间的大小来判断是否符合条件并选择最佳组合

新思路:

  1. 不计算具体数值:直接通过比较 tripletpair 的大小来判断哪个组合更好。
  2. 优先选择较大的 tripletpair,而不计算它们的总和。
  3. 确保 tripletpair 不相等tripletpair 必须是不同的牌面值。

再次调整:

在找到三个相同的牌时,它仍然可以被包括在两个相同的值中,但在进行比较时,优先选择三个相同的牌(triplet)。一旦选出最大的 triplet 后,它就不再参与后续的 pair 组合。接下来,我们可以基于这个思路进行调整:

修改思路:

  1. tripletpair 的值同时比较:我们依然优先选择三张相同牌作为 triplet,但在处理过程中,将三个相同的牌视作两个相同的牌之一进行比较。
  2. 踢出已选的最大 triplet:一旦选出最大的 triplet,从 two_of_a_kind 中移除该 triplet,确保它不会在后续的选择中再次被使用。
  3. 处理剩余的 pair:在选出最大 triplet 后,再从剩下的两张相同牌中选择一个最佳的 pair。 但这个思路忽略了题目中更新的条件选出来的五张牌排面之和不能超过给定的最大值maxmax,因此我再次进行了调整
  • 第一轮:选择最大的 triplet(三个相同的牌),并计算它的总值。

  • 第二轮:选择剩余的最大 pair(两张相同的牌),并计算它的总值。

  • 在选出 tripletpair 后,检查它们的总值是否小于或等于 max_sum

  • 如果总值超过 max_sum,则返回 [0, 0],否则返回选出的 tripletpair

但尽管调整结束,依然无法得到正确值

`from collections import Counter

def solution(n, max_sum, array): # 牌面值排序规则:A -> 1 (最大), K -> 13, Q -> 12, ..., 2 -> 2 (最小) value_map = {'A': 1, 'K': 13, 'Q': 12, 'J': 11, '10': 10, '9': 9, '8': 8, '7': 7, '6': 6, '5': 5, '4': 4, '3': 3, '2': 2}

# 将牌面值转换为数字:将 'A', 'K', 'Q', ... 转为对应的数字
numeric_array = []
for card in array:
    if card == 'A': numeric_array.append(1)
    elif card == 'K': numeric_array.append(13)
    elif card == 'Q': numeric_array.append(12)
    elif card == 'J': numeric_array.append(11)
    elif card == '10': numeric_array.append(10)
    else: numeric_array.append(int(card))  # 对于其他数字牌 2-9

# 统计各牌面值的出现次数
counter = Counter(numeric_array)

# 找到所有可以组成三张相同牌的牌面值
three_of_a_kind = []
two_of_a_kind = []

for value, count in counter.items():
    if count >= 3:
        three_of_a_kind.append(value)
    if count >= 2:
        two_of_a_kind.append(value)

# 对三张相同牌和两张相同牌排序
three_of_a_kind.sort(reverse=True)  # 先按三张牌大小排序,降序
two_of_a_kind.sort(reverse=True)    # 然后按两张牌大小排序,降序

# 第一轮:选出最大的三张相同牌作为 triplet
max_triplet = -1
max_pair = -1
for triplet in three_of_a_kind:
    max_triplet = triplet
    # 移除选中的 triplet 值
    two_of_a_kind.remove(triplet)
    break  # 选出最大 triplet 后跳出循环

# 第二轮:选择最大的两张相同牌作为 pair
if max_triplet != -1:
    for pair in two_of_a_kind:
        max_pair = pair
        break  # 选出最大 pair 后跳出循环

# 如果找到了符合条件的“葫芦”,则计算总和并检查是否超出 max_sum
if max_triplet != -1 and max_pair != -1:
    total_value = max_triplet * 3 + max_pair * 2
    # 如果总和超过最大值,则返回[0, 0]
    if total_value <= max_sum:
        return [max_triplet, max_pair]

# 如果没有符合条件的葫芦或总和超出限制,则返回[0, 0]
return [0, 0]

测试用例

if name == "main": print(solution(31, 42, [3, 3, 11, 12, 12, 2, 13, 5, 13, 1, 13, 8, 8, 1, 8, 13, 12, 9, 2, 11, 3, 5, 8, 11, 1, 11, 1, 5, 4, 2, 5]) == [1, 13]) # [1, 13] `

不太清楚思路出现了什么问题,希望后续我能找到结果。ε=(´ο`*)))唉