11月21日 环形数组中的最大贡献值
问题描述
小S拿到了一个长度为 n 的环形数组,并定义了两个下标 i 和 j 的贡献值公式为:f(i, j) = (a[i] + a[j]) × dist(i, j) 其中 dist(i, j) 是下标 i 和 j 在数组中的最短距离。小S希望找到一对下标,使得它们的贡献值尽可能大。环形数组的特点是最左和最右的元素也是相邻的。你需要帮助她找到最大贡献值。 例如,给定数组 [1, 2, 3],由于是环形数组,任意两个下标的距离都是1,因此 (2 , 3) = ( 2 + 3 ) × 1 = 5 f(2,3)=(2+3)×1=5。
思路分析:
-
环形数组特点:
- 首尾相连,例如数组
[1, 2, 3],0和2的距离是1。
- 首尾相连,例如数组
-
贡献值公式:
- 给定两个下标
i和j,贡献值为:f(i, j) = (a[i] + a[j]) × dist(i, j) - 需要计算所有下标对
(i, j)的贡献值,并取最大值。
- 给定两个下标
-
优化思路:
- 双重循环:计算每一对
(i, j)的贡献值。 - 避免重复计算:由于
f(i, j)和f(j, i)相等,可以只计算i < j的情况,减少计算次数。
- 双重循环:计算每一对
代码
def solution(n: int, a: list) -> int: max_value = float('-inf') # 枚举所有 (i, j) 组合 for i in range(n): for j in range(n): # 计算最短距离 dist = min(abs(i - j), n - abs(i - j)) # 计算贡献值 contrib = (a[i] + a[j]) * dist max_value = max(max_value, contrib) return max_value
回答这道题的关键点在于正确理解环形数组的特性,特别是最短距离的计算。可以减少重复计算对于提高效率非常重要。通过只考虑 i < j,可以大幅优化双重循环。
11月22日 a替换函数
问题描述
给定一个字符串 s,编写一个函数,将字符串中的小写字母a替换为"%100",并返回替换后的字符串。 例如,对于字符串"abcdwa",所有a字符会被替换为"%100",最终结果为%100bcdw%100"。
思考
Python内置的 str.replace() 方法非常适合这种替换需求。
- 用法:s.replace(old, new) 将字符串中的 old 替换为 new。
代码
def solution(s: str) -> str: return s.replace('a', '%100')
这道题使用 str.replace() 非常简洁和高效,很适合考察对字符串处理函数的熟悉程度。
11月23日 数字字符串格式化
问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
思考
首先需要去掉输入字符串中的前导零,确保数字格式正确。我们用 lstrip('0') 来去除多余的零,并特别处理 0 的情况,如果字符串只包含零,则返回 '0'。 通过 split('.') 将整数部分和小数部分分开,如果没有小数点,说明输入的是整数部分。 将整数部分转换为整数类型,然后使用 Python 格式化字符串 f"{int(integer_part):,}" 来添加千分位逗号。 最后将格式化后的整数部分与小数部分合并,若有小数部分,保留,否则只输出整数部分。
代码
def solution(s: str) -> str: # 去除前导零,但要保留单独的"0" s = s.lstrip('0') or '0' # 分离整数部分和小数部分 if '.' in s: integer_part, decimal_part = s.split('.') else: integer_part, decimal_part = s, '' # 格式化整数部分,添加千分位逗号 formatted_integer = f"{int(integer_part):,}" # 组合结果,如果有小数部分,加上 return formatted_integer + ('.' + decimal_part if decimal_part else '')
本题涉及了字符串的处理技巧,包括去除前导零、分割字符串和格式化输出等。 Python的字符串格式化功能非常强大,能方便地实现千分位的转换。 通过这种方式,可以轻松处理格式化数字字符串的需求。
11月24日 数组元素之和最小化
问题描述
小C希望构造一个包含n个元素的数组,且满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数为 k。
- 数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
思考
本题目的关键是将复杂的条件转化为数学问题。最大公约数(GCD) 的概念告诉我们,所有元素必须是某个特定值 k 的倍数。实际上是如何构造一个满足 GCD 条件并且最小化和的数组。
代码
def solution(n: int, k: int) -> int: # write code here return k*(n+1)*n/2
这类题目考察对 基础概念的理解 和 优化思路的设计,特别是在限制条件多的时候。学会将复杂问题转化为简单数学问题,是提升编程能力的重要一步。