AI 刷题 187.小F的寻找字符任务 题解 | 豆包MarsCode AI刷题

51 阅读3分钟

187.小F的寻找字符任务

  • 问题描述

小F和他的朋友们围成了一个圈,他们每个人背上贴了一个字母,要么是A,要么是B。从第一个人开始计数,每当他遇到一个贴着字母A的人就计数一次。当他计数到第k个A时,任务就结束了。你需要帮助小F计算一下,他总共需要数多少个人才能在第k次遇到A后停止。保证至少有一个人背上贴的是A

  • 问题理解

小F和他的朋友们围成了一个圈,每个人背上贴了一个字母,要么是A,要么是B。小F从第一个人开始计数,每当他遇到一个贴着字母A的人就计数一次。当他计数到第k个A时,任务就结束了。我们需要计算小F总共需要数多少个人才能在第k次遇到A后停止。

  • 数据结构选择

由于这是一个字符串问题,我们可以直接使用字符串来表示每个人的字母。

  • 算法步骤

  1. 初始化计数器:我们需要两个计数器,一个用于记录遇到的A的数量,另一个用于记录总共数了多少个人。
  2. 遍历字符串:从第一个人开始,逐个检查每个人背上的字母。
  3. 检查当前字母:如果当前字母是A,则增加A的计数器。
  4. 增加总人数计数:无论当前字母是什么,都需要增加总人数计数。
  5. 检查是否达到目标:如果A的计数器达到了k,则返回总人数计数。
  6. 循环遍历:如果遍历完一轮还没有找到第kA,则继续下一轮遍历,直到找到第kA为止。
  • 关键点

    • 由于是一个圈,遍历完一轮后需要继续下一轮,直到找到第kA
    • 保证至少有一个人背上贴的是A,所以不需要考虑没有A的情况。
  • 难点分析

  1. 循环遍历

    • 由于小F和他的朋友们围成了一个圈,我们需要处理循环遍历的情况。也就是说,当遍历到字符串的末尾时,需要重新从字符串的开头继续遍历,直到找到第kA为止。
    • 这个难点在于如何正确地处理循环遍历的逻辑,确保不会陷入无限循环。
  2. 计数器的管理

    • 我们需要两个计数器:一个用于记录遇到的A的数量,另一个用于记录总共数了多少个人。
    • 在循环遍历的过程中,需要正确地更新这两个计数器,并且在找到第kA时及时返回总人数计数。
  3. 边界条件

    • 题目保证至少有一个人背上贴的是A,但我们需要考虑在极端情况下(例如k非常大),如何高效地处理循环遍历。
    • 确保在遍历过程中不会出现逻辑错误或死循环。
  • 代码部分

def solution(n: int, k: int, people: str) -> int:
    # 初始化计数器
    count_A = 0
    total_count = 0
    
    # 遍历字符串
    for i in range(n):
        # 检查当前字母
        if people[i] == 'A':
            count_A += 1
        
        # 增加总人数计数
        total_count += 1
        
        # 如果找到了第 k 个 A,返回总人数
        if count_A == k:
            return total_count
    
    # 如果遍历完一轮还没有找到第 k 个 A,继续下一轮
    while count_A < k:
        for i in range(n):
            if people[i] == 'A':
                count_A += 1
            total_count += 1
            if count_A == k:
                return total_count
    
    return total_count

if __name__ == '__main__':
    print(solution(3, 3, "AAB") == 4)
    print(solution(3, 3, "BBA") == 9)
    print(solution(5, 4, "ABABA") == 6)