11月18日-11月20日刷题总结 | 豆包MarsCode AI刷题

101 阅读5分钟

11与18日 小U的数字插入问题

问题描述 

小U手中有两个数字 a 和 b。第一个数字是一个任意的正整数,而第二个数字是一个非负整数。她的任务是将第二个数字 b 插入到第一个数字 a 的某个位置,以形成一个最大的可能数字。 你需要帮助小U找到这个插入位置,输出插入后的最大结果。

思路

本题的目标是将数字 b 插入到数字 a 的某个位置,使得组合后的新数字最大。 

我们可以将 a 和 b 转换成字符串,便于在不同位置插入 b。并遍历 a 的每个位置(包括末尾),尝试将 b 插入到当前位置。 组合新的字符串并转换回整数,记录所有组合中的最大值。比较所有可能组合的值,返回其中最大的一个。

代码

def solution(a: int, b: int) -> int:    a_str = str(a)    b_str = str(b)    max_result = -1    # 尝试将 b 插入到每个位置    for i in range(len(a_str) + 1):        # 构造插入后的数字        new_number = int(a_str[:i] + b_str + a_str[i:])        # 更新最大值        max_result = max(max_result, new_number)    return max_result

这个问题是典型的字符串操作与最大值优化的结合,考察了对基本数据类型转换的掌握以及逻辑推理能力。我们在解决过程中,需要理解插入位置的概念,并灵活应用字符串切片来构造不同的组合。 

11月19日 超市里的货物架调整

问题描述

在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 n 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。 作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。

输入变量说明: 

  • n:货物架的格子数 
  • m:顾客想要购买的商品种类数 
  • s:货物架上商品的初始顺序 
  • c:顾客想要购买的商品种类

思考

这个问题涉及最大化商品的售出数量,核心在于调整货物架上的商品顺序,使顾客能够尽可能多地找到并购买到所需的商品。调整前后货物的总数量不变,因此我们的目标是根据顾客需求优化排列顺序。 

步骤分解: 

统计货架上的商品数量: 使用 Counter 统计货物架上每种商品的数量,形成一个库存映射。 

统计顾客的需求: 同样使用 Counter 统计顾客想要购买的商品种类及数量。 

计算最优售出数量: 遍历顾客需求列表,对于每种商品: 如果商品在库存中存在,则能售出的最大数量为库存量和需求量之间的最小值。 将该商品的售出数量累加到总售出数量中。 

关键知识点: 

  • 哈希表(Counter): 利用 Counter 可以快速统计字符串中每个字符出现的次数,便于与需求匹配。Counter 与字典有些类似,它提供了许多实用的方法,使得它在计数场景中比普通字典更灵活。

创建一个 Counter 对象:

from collections import Counter
example = Counter("abcabc")
print(example)  # 输出:Counter({'a': 2, 'b': 2, 'c': 2})
print(example['a'])  # 输出:2
print(example['d'])  # 输出:0 (如果键不存在,返回 0 而不会报错)

代码

from collections import Counter

def solution(n: int, m: int, s: str, c: str) -> int:
    # 统计货架上的商品数量和顾客需求
    stock = Counter(s)
    demand = Counter(c)
    
    # 计算最多能卖出的商品数量
    sold_count = 0
    for item, required in demand.items():
        if item in stock:
            sold_count += min(stock[item], required)  # 卖出商品为库存和需求的最小值
    
    return sold_count

与这道题类似的场景在库存管理、资源分配中非常常见。在本题中,我们需要理解哈希表和基本逻辑判断,可以帮助解决更多复杂的匹配和分配问题。

11月20日 游戏排名第三大的分数

问题描述 

小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下: 如果分数中有三个或以上不同的分数,返回其中第三大的分数。 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。 请你帮小M根据给定的分数数组计算目标分数。

思考

      从给定的分数数组中找到第三大不同分数,如果不同分数少于三个,则返回最大的分数。 因为分数数组中可能有重复分数,我们只需要考虑不同的分数。对去重后的分数进行降序排序。如果不同分数的数量大于等于3,则返回排序后的第三个分数。 如果不同分数的数量少于3,则返回最大的分数。

知识点

  • 集合(Set)可以去重并保留唯一元素。 但是集合是无序的,不能保证元素的顺序。

  • 使用 sorted() 函数进行排序,可以通过添加 reverse=True 实现降序排序。

代码

def solution(n: int, nums: list) -> int:    # 去重并降序排序    unique_scores = sorted(set(nums), reverse=True)        # 如果有至少 3 个不同分数,返回第三大的    if len(unique_scores) >= 3:        return unique_scores[2]    # 否则返回最大的分数    return unique_scores[0]

这道题启发我们需要充分利用 Python 等语言的内置函数(如 set()、sorted())可以极大提升代码效率和可读性。