4 / 6第一题问题描述
给定一个字符串 ss,该字符串中只包含英文大小写字母。你需要计算从字符串中最多能组成多少个字符串 "ku"。每次可以随机从字符串中选一个字符,并且选中的字符不能再使用。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。
例如,输入 "AUBTMKAxfuu",从中最多能组成 1 个 "ku"。
测试样例
样例1:
输入:
s = "AUBTMKAxfuu"
输出:1
样例2:
输入:
s = "KKuuUuUuKKKKkkkkKK"
输出:6
样例3:
输入:
s = "abcdefgh"
输出:0
问题理解
你需要从给定的字符串中计算出最多能组成多少个字符串 "ku"。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。
数据结构选择
- 由于我们只需要统计字符 'k' 和 'u' 的数量,因此可以使用简单的计数器。
算法步骤
- 转换为小写:将输入字符串转换为小写,以便统一处理大小写字母。
- 统计字符数量:统计字符 'k' 和 'u' 的数量。
- 计算最大组合数:由于每个 "ku" 需要一个 'k' 和一个 'u',所以最多能组成的 "ku" 的数量是
min(k_count, u_count)。 - 返回结果:返回计算出的最大组合数。
代码实现
def solution(s: str) -> int:
# 统计字符 'k' 和 'u' 的数量
k_count = s.lower().count('k')
u_count = s.lower().count('u')
# 返回可以组成的 "ku" 的最大数量
return min(k_count, u_count)
if __name__ == '__main__':
print(solution("AUBTMKAxfuu") == 1)
print(solution("KKuuUuUuKKKKkkkkKK") == 6)
print(solution("abcdefgh") == 0)
解释
- 统计字符数量:首先将字符串转换为小写,然后统计字符 'k' 和 'u' 的数量。
- 计算最大组合数:由于每个 "ku" 需要一个 'k' 和一个 'u',所以最多能组成的 "ku" 的数量是
min(k_count, u_count)。 - 返回结果:返回计算出的最大组合数。
4 / 6第二题问题描述
小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:
- 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
- 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。
请你帮小M根据给定的分数数组计算目标分数。
测试样例
样例1:
输入:
n = 3,nums = [3, 2, 1]
输出:1
样例2:
输入:
n = 2,nums = [1, 2]
输出:2
样例3:
输入:
n = 4,nums = [2, 2, 3, 1]
输出:1
问题理解
- 目标:找到给定分数数组中第三大的分数,如果没有三个不同的分数,则返回最大的分数。
- 输入:一个整数
n表示分数的数量,一个包含n个整数的列表nums。 - 输出:一个整数,表示目标分数。
数据结构选择
- 集合:使用集合可以自动去重,简化后续处理。
- 排序:对去重后的集合进行排序,便于找到第三大的分数。
算法步骤
- 去重:将分数列表转换为集合,去除重复的分数。
- 排序:对去重后的集合进行降序排序。
- 判断返回值:
- 如果排序后的集合长度大于等于3,返回第三大的分数。
- 否则,返回最大的分数。
代码框架
def solution(n: int, nums: list) -> int:
# 使用集合去重并排序
unique_nums = sorted(set(nums), reverse=True)
# 如果不同的分数有三个或以上,返回第三大的分数
if len(unique_nums) >= 3:
return unique_nums[2]
# 否则返回最大的分数
else:
return unique_nums[0]
if __name__ == '__main__':
print(solution(3, [3, 2, 1]) == 1)
print(solution(2, [1, 2]) == 2)
print(solution(4, [2, 2, 3, 1]) == 1)
关键步骤
- 去重和排序:使用
set去重,然后使用sorted函数对去重后的数组进行降序排序。 - 判断返回值:根据去重后的数组长度,决定返回第三大的分数还是最大的分数。
代码实现
def solution(n: int, nums: list) -> int:
# write code here
# 使用集合去重并排序
unique_nums = sorted(set(nums), reverse=True)
# 如果不同的分数有三个或以上,返回第三大的分数
if len(unique_nums) >= 3:
return unique_nums[2]
# 否则返回最大的分数
else:
return unique_nums[0]
if __name__ == '__main__':
print(solution(3, [3, 2, 1]) == 1)
print(solution(2, [1, 2]) == 2)
print(solution(4, [2, 2, 3, 1]) == 1)
解释
- 去重和排序:首先使用
set去重,然后使用sorted函数对去重后的数组进行降序排序。 - 判断返回值:如果去重后的数组长度大于等于3,则返回第三大的数;否则返回最大的数。
这样就可以满足题目要求,找到小M的目标分数。
4/ 6 第三题问题描述
小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。如果射击点超出所有的环,则得0分。
根据给定的射击坐标(x, y),请计算小E的射击得分。
测试样例
样例1:
输入:
x = 1, y = 0
输出:10
样例2:
输入:
x = 1, y = 1
输出:9
样例3:
输入:
x = 0, y = 5
输出:6
样例4:
输入:
x = 3, y = 4
输出:6好的,让我们来分析一下这个问题的解题思路:
问题理解
-
靶心和环的定义:
- 靶心位于坐标
(0, 0)。 - 靶心内(半径为1)得10分,依次向外的每个环分数减少1分。
- 如果射击点在某个半径为
i的圆内,则得11-i分。 - 如果射击点超出所有的环,则得0分。
- 靶心位于坐标
-
输入输出:
- 输入:射击点的坐标
(x, y)。 - 输出:射击得分。
- 输入:射击点的坐标
数据结构选择
- 由于我们只需要计算一个点的得分,不需要复杂的数据结构。
算法步骤
-
计算射击点到靶心的距离:
- 使用欧几里得距离公式:
distance = sqrt(x^2 + y^2)。
- 使用欧几里得距离公式:
-
根据距离计算得分:
- 使用条件判断语句(如
if-elif-else)来判断距离属于哪个环,并返回相应的得分。
- 使用条件判断语句(如
代码实现
def solution(x: int, y: int) -> int:
# 计算射击点到靶心的距离
distance = (x ** 2 + y ** 2) ** 0.5
# 根据距离计算得分
if distance <= 1:
return 10
elif distance <= 2:
return 9
elif distance <= 3:
return 8
elif distance <= 4:
return 7
elif distance <= 5:
return 6
elif distance <= 6:
return 5
elif distance <= 7:
return 4
elif distance <= 8:
return 3
elif distance <= 9:
return 2
elif distance <= 10:
return 1
else:
return 0
if __name__ == '__main__':
print(solution(1, 0) == 10)
print(solution(1, 1) == 9)
print(solution(0, 5) == 6)
print(solution(3, 4) == 6)
关键步骤
- 计算距离:使用
(x ** 2 + y ** 2) ** 0.5计算距离。 - 判断得分:使用
if-elif-else结构根据距离判断得分。