AI刷题题目解析02 | 豆包MarsCode AI刷题

84 阅读4分钟

3.数字字符串格式化

问题描述

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

解题思路

  1. 去除前导零

    • 使用 lstrip('0') 方法去除字符串 s 前面的所有 0
  2. 分离整数部分和小数部分

    • 检查字符串 s 中是否包含小数点 .
    • 如果包含小数点,使用 split('.') 方法将字符串分割为整数部分和小数部分。
    • 如果不包含小数点,则整数部分为原字符串,小数部分为空字符串。
  3. 处理整数部分,添加千分位逗号

    • 如果整数部分不为空,首先将整数部分反转,以便从后向前每三位添加一个逗号。
    • 使用 reversed() 和 join() 方法将整数部分反转,并使用 , 作为分隔符,每三位添加一个逗号。
    • 再次反转整数部分,使其恢复原来的顺序。
  4. 合并结果

    • 将处理后的整数部分作为结果。
    • 如果存在小数部分,将小数部分添加到结果中,并在整数部分和小数部分之间添加小数点 .

代码实现

def solution(s: str) -> str:
    # 去除前导零
    s = s.lstrip('0')
    
    # 分离整数部分和小数部分
    if '.' in s:
        integer_part, decimal_part = s.split('.')
    else:
        integer_part, decimal_part = s, ''
    
    # 处理整数部分,添加千分位逗号
    if integer_part:
        integer_part = ''.join(reversed(integer_part))  # 反转字符串
        integer_part = ','.join(integer_part[i:i+3] for i in range(0, len(integer_part), 3))
        integer_part = ''.join(reversed(integer_part))  # 再次反转回来
    
    # 合并结果
    result = integer_part
    if decimal_part:
        result += '.' + decimal_part
    
    return result

5.寻找最大葫芦

问题描述

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

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

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

解题思路

  1. 统计牌面值的出现次数

    • 使用 collections.Counter 统计输入数组中每种牌面值出现的次数。
  2. 自定义排序函数

    • 定义一个自定义排序函数 custom_sort,将牌面值从大到小排序,但将 1 排在最前面(因为 1 代表 A,是最大的牌面值)。
  3. 排序牌面值

    • 使用 sorted 函数和自定义排序函数 custom_sort 对牌面值进行排序,确保 1 排在最前面,其他牌面值按从大到小的顺序排列。
  4. 查找符合条件的“葫芦”

    • 遍历排序后的牌面值,查找符合条件的“葫芦”组合。
    • 对于每个牌面值 a,如果其出现次数大于等于 3,再遍历其他牌面值 b,如果 b 的出现次数大于等于 2 且 a 不等于 b,计算当前“葫芦”的和(3 * a + 2 * b)。
    • 如果当前“葫芦”的和小于等于给定的最大值 max,则返回 [a, b]

代码实现

def solution(n, max, array):
    # 统计每种牌面值出现的次数
    from collections import Counter
    count = Counter(array)
    
    # 将牌面值从大到小排序,但将1排在最前面
    def custom_sort(x):
        if x == 1:
            return 14  # 1 排在最前面
        else:
            return x  # 其他牌面值按从大到小的顺序排列
    
    # 将牌面值按自定义排序函数排序
    sorted_values = sorted(count.keys(), key=custom_sort, reverse=True)
    
    # 遍历排序后的牌面值,查找符合条件的“葫芦”
    for a in sorted_values:
        if count[a] >= 3:
            for b in sorted_values:
                if a != b and count[b] >= 2:
                    # 计算当前“葫芦”的和
                    if 3 * a + 2 * b <= max:
                        return [a, b]
    
    # 如果没有找到符合条件的“葫芦”,返回 [0, 0]
    return [0, 0]