数字字符串格式化和寻找最大葫芦| 豆包MarsCode AI刷题

数字字符串格式化

问题描述

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。


测试样例

样例1:

输入:s = "1294512.12412"
输出:'1,294,512.12412'

样例2:

输入:s = "0000123456789.99"
输出:'123,456,789.99'

样例3:

输入:s = "987654321"
输出:'987,654,321'

思路

简单的数字字符串格式化问题,没有太多难度

  1. 去除前导零:首先,你需要去除字符串前面的无用零。可以使用 lstrip('0') 方法来去除字符串前面的零。
  2. 分离整数和小数部分:将字符串分为整数部分和小数部分。可以使用 split('.') 方法来分离整数和小数部分。
  3. 格式化整数部分:对整数部分进行千分位格式化。可以使用 reversed()zip() 函数来实现每隔三位插入一个逗号。
  4. 合并整数和小数部分:最后,将格式化后的整数部分和小数部分重新合并。
def solution(s: str) -> str:
    # 去除前导零
    s = s.lstrip('0')
    
    # 分离整数和小数部分
    if '.' in s:
        integer_part, fractional_part = s.split('.')
    else:
        integer_part, fractional_part = s, ''
    
    # 格式化整数部分
    if integer_part:
        integer_part = ''.join(reversed([x + (',' if i and i % 3 == 0 else '') for i, x in enumerate(reversed(integer_part))]))
    
    # 合并整数和小数部分
    result = integer_part
    if fractional_part:
        result += '.' + fractional_part
    
    return result

if __name__ == '__main__':
    print(solution("1294512.12412") == '1,294,512.12412')
    print(solution("0000123456789.99") == '123,456,789.99')
    print(solution("987654321") == '987,654,321')

寻找最大葫芦

问题描述

在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 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]

思路

解题思路

  1. 数据结构选择

    • 使用字典来统计每种牌面值的数量。
    • 使用列表来存储牌面值,并进行排序。
  2. 算法步骤

    • 统计每种牌面值的数量。

    • 对牌面值进行排序,从大到小,特别注意A的牌面值为14(而不是1)。

    • 遍历排序后的牌面值,尝试找到符合条件的“葫芦”组合:

      • 首先尝试找到三张相同牌面值的牌。
      • 然后尝试找到两张相同牌面值的牌。
      • 检查组合的牌面值之和是否不超过给定的最大值。

同时还要注意1大于其他所有数的情况,所以暂时记为14,并在判断之前还原

def solution(n, max, array):
    # 统计每种牌面值的数量
    count = {}
    for card in array:
        if card == 1:  # 将A的牌面值设为14
            card = 14
        if card in count:
            count[card] += 1
        else:
            count[card] = 1
    
    # 对牌面值进行排序,从大到小
    sorted_cards = sorted(count.keys(), reverse=True)
    
    # 遍历排序后的牌面值,尝试找到符合条件的“葫芦”组合
    for a in sorted_cards:
        if count[a] >= 3:
            for b in sorted_cards:
                if a != b and count[b] >= 2:
                    a1=a
                    if a==14:
                        a1=1
                    b1=b
                    if b==14:
                        b1=1
                    # 检查组合的牌面值之和是否不超过给定的最大值
                    if (3 * a1 + 2 * b1) <= max:
                        return [a1, b1]
    
    # 如果没有找到符合条件的“葫芦”组合,返回 [0, 0]
    return [0, 0]

if __name__ == "__main__":
    # Add your test cases here
    print(solution(44, 36, [6, 6, 6, 8, 8, 8, 5, 5, 1]) == [8, 5])
    print(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13]) == [6, 9])
    print(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6]) == [0, 0])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值