5 / 6 第一题问题描述
小C定义了一个“完美偶数”。一个正整数 xx 被认为是完美偶数需要满足以下两个条件:
- xx 是偶数;
- xx 的值在区间 [l,r][l,r] 之间。
现在,小C有一个长度为 nn 的数组 aa,她想知道在这个数组中有多少个完美偶数。
测试样例
样例1:
输入:
n = 5,l = 3,r = 8,a = [1, 2, 6, 8, 7]
输出:2
样例2:
输入:
n = 4,l = 10,r = 20,a = [12, 15, 18, 9]
输出:2
样例3:
输入:
n = 3,l = 1,r = 10,a = [2, 4, 6]
输出:3。
问题理解
我们需要在一个数组中找出满足以下两个条件的数:
- 这些数是偶数。
- 这些数在给定的区间
[l, r]之间。
数据结构选择
- 数组
a:用于存储输入的数字。 - 整数
l和r:用于定义区间的下限和上限。
算法步骤
- 初始化计数器:用于记录满足条件的数的数量。
- 遍历数组:逐个检查数组中的每个元素。
- 检查条件:
- 检查当前元素是否为偶数(即
num % 2 == 0)。 - 检查当前元素是否在区间
[l, r]之间(即l <= num <= r)。
- 检查当前元素是否为偶数(即
- 更新计数器:如果当前元素满足上述两个条件,则增加计数器的值。
- 返回结果:遍历结束后,返回计数器的值。
代码
def solution(n: int, l: int, r: int, a: list) -> int:
# 初始化计数器
count = 0
# 遍历数组
for num in a:
# 检查条件
if num % 2 == 0 and l <= num <= r:
# 更新计数器
count += 1
# 返回结果
return count
5/ 6 第二题问题描述
给定一个字符串ss,编写一个函数,将字符串中的小写字母a替换为"%100",并返回替换后的字符串。
例如,对于字符串"abcdwa",所有a字符会被替换为"%100",最终结果为%100bcdw%100"。
测试样例
样例1:
输入:
s = "abcdwa"
输出:'%100bcdw%100'
样例2:
输入:
s = "banana"
输出:'b%100n%100n%100'
样例3:
输入:
s = "apple"
输出:'%100pple'
解题思路
- 理解问题:我们需要将字符串中的所有小写字母
'a'替换为"%100"。 - 数据结构选择:字符串是不可变的,因此我们需要使用一个可变的数据结构来存储结果,比如列表。
- 算法步骤:
- 遍历字符串中的每一个字符。
- 如果字符是
'a',则将其替换为"%100"。 - 否则,保持字符不变。
- 最后,将列表转换回字符串。
代码
def solution(s: str) -> str:
# 初始化一个空列表来存储结果
result = []
# 遍历字符串中的每一个字符
for char in s:
# 如果字符是 'a',则替换为 "%100"
if char == 'a':
result.append("%100")
else:
# 否则,保持字符不变
result.append(char)
# 将列表转换回字符串并返回
return ''.join(result)
if __name__ == '__main__':
print(solution(s="abcdwa") == '%100bcdw%100')
print(solution(s="banana") == 'b%100n%100n%100')
print(solution(s="apple") == '%100pple')
关键步骤
- 初始化结果列表:
result = [] - 遍历字符串:
for char in s: - 替换字符:
if char == 'a': result.append("%100") - 保持字符不变:
else: result.append(char) - 转换回字符串:
return ''.join(result)
5/ 6第三题问题描述
小M是一个五年级的小学生,今天他学习了整除的知识,想通过一些练习来巩固自己的理解。他写下了一个长度为 n 的正整数序列 a_0, a_1, ..., a_{n-1},然后想知道有多少个连续子序列的和能够被一个给定的正整数 b 整除。你能帮小M解决这个问题吗?
测试样例
样例1:
输入:
n = 3,b = 3,sequence = [1, 2, 3]
输出:3
样例2:
输入:
n = 4,b = 5,sequence = [5, 10, 15, 20]
输出:10
样例3:
输入:
n = 5,b = 2,sequence = [1, 2, 3, 4, 5]
输出:6
为了帮助小M解决这个问题,我们可以使用前缀和和哈希表来高效地计算有多少个连续子序列的和能够被给定的正整数 b 整除。以下是详细的解题思路和代码实现:
解题思路
-
前缀和:我们首先计算序列的前缀和数组
prefix_sum,其中prefix_sum[i]表示从序列的开始到第i个元素的和。 -
哈希表:我们使用一个哈希表
remainder_count来记录每个前缀和除以b的余数出现的次数。初始时,余数为 0 的次数为 1(因为空前缀和为 0)。 -
计算结果:对于每个前缀和
prefix_sum[i],我们计算它除以b的余数remainder。然后,我们在哈希表中查找remainder出现的次数,并将这个次数加到结果中。接着,我们将remainder的次数加 1。
代码实现
def solution(n, b, sequence):
# 初始化前缀和数组和哈希表
prefix_sum = 0
remainder_count = {0: 1} # 初始化余数为0的次数为1
result = 0
for num in sequence:
# 更新前缀和
prefix_sum += num
# 计算当前前缀和除以b的余数
remainder = prefix_sum % b
# 如果余数已经在哈希表中,说明存在一些子序列的和可以被b整除
if remainder in remainder_count:
result += remainder_count[remainder]
remainder_count[remainder] += 1
else:
remainder_count[remainder] = 1
return result
if __name__ == "__main__":
# 测试样例
sequence = [1, 2, 3]
print(solution(3, 3, sequence) == 3)
sequence = [5, 10, 15, 20]
print(solution(4, 5, sequence) == 10)
sequence = [1, 2, 3, 4, 5]
print(solution(5, 2, sequence) == 6)
解释
prefix_sum记录当前的前缀和。remainder_count记录每个余数出现的次数。- 对于每个元素,我们更新前缀和并计算余数。
- 如果余数已经在哈希表中,说明存在一些子序列的和可以被
b整除,我们将这些子序列的数量加到结果中。 - 最后返回结果。
这个方法的时间复杂度是 O(n),空间复杂度是 O(b),其中 n 是序列的长度,b 是给定的正整数。