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())可以极大提升代码效率和可读性。