首页 > 其他分享 >字节青训-寻找最大葫芦

字节青训-寻找最大葫芦

时间:2024-11-02 18:44:25浏览次数:4  
标签:count 13 字节 max value 面值 青训 card 葫芦

问题描述

在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 aa 和另外两张相同牌面值的牌 bb。如果两个人同时拥有“葫芦”,我们会优先比较牌 aa 的大小,若牌 aa 相同则再比较牌 bb 的大小。

在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 maxmax。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。

给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。

测试样例

样例1:

输入:n = 9, max = 34, array = [6, 6, 6, 8, 8, 8, 5, 5, 1]
输出:[8, 5]

样例2:

输入:n = 9, max = 37, array = [9, 9, 9, 9, 6, 6, 6, 6, 13]
输出:[6, 9]

样例3:

输入:n = 9, max = 40, array = [1, 11, 13, 12, 7, 8, 11, 5, 6]
输出:[0, 0]

 

 解题思路:

问题理解

我们需要找到一组牌中符合“葫芦”规则的最大组合。具体来说,“葫芦”由三张相同牌面值的牌和两张相同牌面值的牌组成,并且这五张牌的牌面值之和不能超过给定的最大值 max

数据结构选择

  1. 牌面值的映射:由于牌面值的大小规则是 A > K > Q > J > 10 > 9 > ... > 2,我们可以使用一个映射来表示这些牌面值,例如:

    unordered_map<int, int> cardValue = {
        {1, 14},  // A
        {13, 13}, // K
        {12, 12}, // Q
        {11, 11}, // J
        {10, 10}, // 10
        {9, 9},   // 9
        {8, 8},   // 8
        {7, 7},   // 7
        {6, 6},   // 6
        {5, 5},   // 5
        {4, 4},   // 4
        {3, 3},   // 3
        {2, 2}    // 2
    };

    这样我们可以方便地比较牌面值的大小。

  2. 牌的计数:我们可以使用一个 std::unordered_map<int, int> 来统计每种牌面值的出现次数。

算法步骤

  1. 统计每种牌面值的出现次数:遍历输入的牌数组,统计每种牌面值的出现次数。
  2. 寻找符合条件的“葫芦”
    • 遍历统计结果,找到所有出现次数大于等于3的牌面值,记为 a
    • 对于每个 a,再遍历统计结果,找到所有出现次数大于等于2的牌面值,记为 b
    • 计算 a 和 b 的牌面值之和,如果不超过 max,则记录这个组合。
  3. 选择最大的“葫芦”:在所有符合条件的组合中,选择牌面值最大的 a 和 b

转换成python的最终代码:

from collections import defaultdict

def solution(n, max_sum, array):
    # 牌面值的映射
    card_value = {
        1: 14,  # A
        13: 13, # K
        12: 12, # Q
        11: 11, # J
        10: 10, # 10
        9: 9,   # 9
        8: 8,   # 8
        7: 7,   # 7
        6: 6,   # 6
        5: 5,   # 5
        4: 4,   # 4
        3: 3,   # 3
        2: 2    # 2
    }

    # 统计每种牌面值的出现次数
    count = defaultdict(int)
    for card in array:
        count[card] += 1

    # 寻找符合条件的“葫芦”
    max_a = -1
    max_b = -1
    for a, count_a in count.items():
        if count_a >= 3:
            for b, count_b in count.items():
                if a != b and count_b >= 2:
                    # 计算牌面值之和
                    sum_value = card_value[a] * 3 + card_value[b] * 2
                    if sum_value <= max_sum:
                        # 更新最大组合
                        if max_a == -1 or card_value[a] > card_value[max_a] or \
                           (card_value[a] == card_value[max_a] and card_value[b] > card_value[max_b]):
                            max_a = a
                            max_b = b

    # 返回结果
    if max_a == -1 and max_b == -1:
        return [0, 0]
    else:
        return [max_a, max_b]

# 测试用例
result1 = solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1])
print(result1 == [8, 5])

result2 = solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13])
print(result2 == [6, 9])

result3 = solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6])
print(result3 == [0, 0])

到这里我以为就完了,谁知道!!!,这题面都还有坑 

一开始还以为是测试用例有问题呢,看了好一会才反应过来,A这张牌,它是所有牌中最大的,但是它的牌面却是最小的,nndx,我以为只是默认A是最大的牌呢,这题太害人了

找到问题就好办了,也就是说要特判一次,如果P[1]的数量是大于等于3的,那就直接用它当maxA,如果是小于3但是大于等于2的,直接用来当maxB;

AC代码:

from collections import defaultdict

def solution(n, max_sum, array):
    # 牌面值的映射
    card_value = {
        1: 14,  # A
        13: 13, # K
        12: 12, # Q
        11: 11, # J
        10: 10, # 10
        9: 9,   # 9
        8: 8,   # 8
        7: 7,   # 7
        6: 6,   # 6
        5: 5,   # 5
        4: 4,   # 4
        3: 3,   # 3
        2: 2    # 2
    }

    # 统计每种牌面值的出现次数
    count = defaultdict(int)
    for card in array:
        adjusted_card = card if card != 1 else 14
        count[adjusted_card] += 1

    # 寻找符合条件的“葫芦”
    num3 = 0
    num2 = 0
    current_sum = 0
    for key, value in count.items():
        if value >= 3:
            for other_key, other_value in count.items():
                if other_key != key and other_value >= 2:
                    sum_value = calculate_sum(key if key != 14 else 1, other_key if other_key != 14 else 1)
                    if sum_value <= max_sum:
                        if key > num3 or (key == num3 and other_key > num2):
                            num3 = key
                            num2 = other_key
                            current_sum = sum_value

    # 返回结果
    if current_sum > 0:
        return [num3 if num3 != 14 else 1, num2 if num2 != 14 else 1]
    else:
        return [0, 0]

def calculate_sum(num1, num2):
    return num1 * 3 + num2 * 2

# 测试用例
result1 = solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1])
print(result1 == [8, 5])

result2 = solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13])
print(result2 == [6, 9])

result3 = solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6])
print(result3 == [0, 0])

运行结果:

舒服了

标签:count,13,字节,max,value,面值,青训,card,葫芦
From: https://blog.csdn.net/m0_73302939/article/details/143453441

相关文章

  • 【面试经验】字节tictok三面
    上午面的,今天很忙啊,没来得及分享。面试官人在美国,我看了一下,面试时间是UTC-5的20:00-21:00这些。上来双方自我介绍,面试官的履历很牛,非常牛,字节是他待过最小的公司了可能。然后就直接开coding。1.中序遍历;2.岛屿数量。题不难,我是个算法菜鸡,岛屿不会,应该是凉透了。后面......
  • 【JavaEE初阶】深入理解TCP协议特性之延时应答,捎带应答,面向字节流以及异常处理
     前言......
  • 字节跳动青训营 X 豆包MarsCode入营考核部分题解
    中等:观光景点组合得分问题小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j-i 表示。一对景点 (i<j) 的观光组合得分为 values[i]+values[j]+i-j,也就......
  • 刚面完字节!问了大模型微调SFT,估计凉了
    最近这一两周不少互联网公司都已经开始秋招提前批面试了。不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC在变少,岗位要求还更高了。最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解惑答疑,分享技术面试中的那些弯弯绕绕。总结如下:《大模型面......
  • 08-宽字节注入、GetShell、SQLMap、XSS存储型练习
    1、利用宽字节注入实现“库名-表名”的注入过程,写清楚注入步骤;​ 由于网站的过滤,调用其addslashes()函数在单引号之前添加反斜线\进行转义,我们需要让\无效实现单引号的逃逸。​ 解决方法:因为addslashes()函数使用时会对输入内容进行URL编码(即添加的\也会编码成%5c)在......
  • java计算机毕业设计足球青训俱乐部管理后台系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着社会经济的不断发展,足球运动在大众中的普及程度日益提高,足球青训俱乐部的数量和规模也不断增长。在这种发展趋势下,传统的管理方式已难以应对......
  • 【C#】将bcd字节数组转为10进制字符串
    //////将bcd字节数组转为10进制字符串//////bcd码字节数组///返回转换后的10进制字符串publicstaticstringBCDCodeToDecimalString(byte[]bcd){StringBuildersb=newStringBuilder();for(inti=0;i<bcd.Length;i++){sb.Append(ConvertBCDToInt......
  • 青训营 X 豆包MarsCode 技术训练营--小C的外卖超时判断
    题目小C点了一个外卖,并且急切地等待着骑手的送达。她想知道她的外卖是否超时了。已知小C在时刻t1点了外卖,外卖平台上显示的预计送达时间为t2,而实际送达时间为t3。需要判断外卖是否超时。如果外卖超时,则输出“Yes”;否则输出“No”。实际送达时间与预计送达时间在2......
  • 字节流写入文件
    一、创建输出流对象表示的文件三种方式方法一:FileOutputStreamfos=newFileOutputStream("fos.txt",true);//最简便方法二:FileOutputStreamfos=newFileOutputStream(newFile("fos.txt"));方法三;Filef=newFile("fos.txt");FileOutputStreamfos=new......
  • 四,字节流
    Java字节流详解及应用在Java中,字节流是处理二进制数据的基础,它们可以处理任何类型的数据,因此被称为“万能流”。字节流按照流向划分为字节输入流和字节输出流,按照数据类型划分为字节流和字符流。本文将详细介绍字节流的使用方法,包括构造方法、写数据的方法以及如何实现文件内容的......