4 / 6 | 豆包MarsCode AI刷题

41 阅读6分钟

4 / 6第一题问题描述

给定一个字符串 ss,该字符串中只包含英文大小写字母。你需要计算从字符串中最多能组成多少个字符串 "ku"。每次可以随机从字符串中选一个字符,并且选中的字符不能再使用。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。

例如,输入 "AUBTMKAxfuu",从中最多能组成 1 个 "ku"


测试样例

样例1:

输入:s = "AUBTMKAxfuu"
输出:1

样例2:

输入:s = "KKuuUuUuKKKKkkkkKK"
输出:6

样例3:

输入:s = "abcdefgh"
输出:0

问题理解

你需要从给定的字符串中计算出最多能组成多少个字符串 "ku"。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。

数据结构选择

  • 由于我们只需要统计字符 'k' 和 'u' 的数量,因此可以使用简单的计数器。

算法步骤

  1. 转换为小写:将输入字符串转换为小写,以便统一处理大小写字母。
  2. 统计字符数量:统计字符 'k' 和 'u' 的数量。
  3. 计算最大组合数:由于每个 "ku" 需要一个 'k' 和一个 'u',所以最多能组成的 "ku" 的数量是 min(k_count, u_count)
  4. 返回结果:返回计算出的最大组合数。

代码实现

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)

解释

  1. 统计字符数量:首先将字符串转换为小写,然后统计字符 'k' 和 'u' 的数量。
  2. 计算最大组合数:由于每个 "ku" 需要一个 'k' 和一个 'u',所以最多能组成的 "ku" 的数量是 min(k_count, u_count)
  3. 返回结果:返回计算出的最大组合数。

4 / 6第二题问题描述

小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:

  1. 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
  2. 如果不同的分数只有两个或更少,那么小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

问题理解

  1. 目标:找到给定分数数组中第三大的分数,如果没有三个不同的分数,则返回最大的分数。
  2. 输入:一个整数 n 表示分数的数量,一个包含 n 个整数的列表 nums
  3. 输出:一个整数,表示目标分数。

数据结构选择

  • 集合:使用集合可以自动去重,简化后续处理。
  • 排序:对去重后的集合进行排序,便于找到第三大的分数。

算法步骤

  1. 去重:将分数列表转换为集合,去除重复的分数。
  2. 排序:对去重后的集合进行降序排序。
  3. 判断返回值
    • 如果排序后的集合长度大于等于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)

关键步骤

  1. 去重和排序:使用 set 去重,然后使用 sorted 函数对去重后的数组进行降序排序。
  2. 判断返回值:根据去重后的数组长度,决定返回第三大的分数还是最大的分数。

代码实现

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)

解释

  1. 去重和排序:首先使用 set 去重,然后使用 sorted 函数对去重后的数组进行降序排序。
  2. 判断返回值:如果去重后的数组长度大于等于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 好的,让我们来分析一下这个问题的解题思路:

问题理解

  1. 靶心和环的定义

    • 靶心位于坐标 (0, 0)
    • 靶心内(半径为1)得10分,依次向外的每个环分数减少1分。
    • 如果射击点在某个半径为 i 的圆内,则得 11-i 分。
    • 如果射击点超出所有的环,则得0分。
  2. 输入输出

    • 输入:射击点的坐标 (x, y)
    • 输出:射击得分。

数据结构选择

  • 由于我们只需要计算一个点的得分,不需要复杂的数据结构。

算法步骤

  1. 计算射击点到靶心的距离

    • 使用欧几里得距离公式:distance = sqrt(x^2 + y^2)
  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 结构根据距离判断得分。