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

29 阅读2分钟

问题描述

假设有一群朋友围成一个圈,每个人背上贴了一个字母,要么是 'A' 要么是 'B'。从第一个人开始计数,每当遇到一个背上有 'A' 的人就计数一次。我们需要计算在遇到第 k 个 'A' 之前,总共需要数多少个人。保证至少有一个人背上贴的是 'A'。

示例

  • 输入:n = 3, k = 3, people = "AAB"
  • 输出:4
  • 解释:依次数到的人为 A, A, B, A,共4人,其中第3次遇到 'A'。
  • 输入:n = 3, k = 3, people = "BBA"
  • 输出:9
  • 解释:依次数到的人为 B, B, A, B, B, A, B, B, A,共9人,其中第3次遇到 'A'。
  • 输入:n = 5, k = 4, people = "ABABA"
  • 输出:6
  • 解释:依次数到的人为 A, B, A, B, A, A,共6人,其中第4次遇到 'A'。

问题分析

这个问题的核心在于处理循环数组。我们需要遍历这个数组,直到遇到第 k 个 'A'。由于数组是循环的,所以我们需要使用模运算来处理循环的情况。此外,我们还需要记录已经数过的人数,以确保在达到条件时能够正确返回结果。

解决方案

下面是一个C++代码实现:

int solution(int n, int k, string people) {
    int countA = 0; // 记录遇到'A'的次数
    int totalPeopleCounted = 0; // 记录总共数过的人数

    // 遍历每个人,直到遇到第k个'A'
    for (size_t i = 0; countA < k; ++i) {
        if (people[i % n] == 'A') { // 使用模运算来处理循环
            countA++; // 遇到'A'时增加计数
        }
        totalPeopleCounted++; // 每次循环都增加总人数计数
    }

    return totalPeopleCounted; // 返回总共数过的人数
}

代码解释

  1. 初始化变量

    • countA 用于记录遇到 'A' 的次数。
    • totalPeopleCounted 用于记录总共数过的人数。
  2. 循环遍历

    • 使用 for 循环遍历数组,直到 countA 达到 k
    • 使用 i % n 来处理循环数组,确保在数组末尾后可以从头开始继续计数。
    • 如果当前字符是 'A',则增加 countA
    • 每次循环都增加 totalPeopleCounted
  3. 返回结果

    • 当 countA 达到 k 时,停止循环并返回 totalPeopleCounted

技巧分享

  1. 模运算

    • 在处理循环数组时,使用模运算可以非常方便地实现循环效果。例如,i % n 可以确保索引始终在有效范围内。
  2. 条件控制

    • 通过设置循环条件 countA < k,我们可以确保在达到目标之前一直进行循环。
  3. 简洁性

    • 保持代码简洁明了,避免不必要的复杂逻辑,这样可以提高代码的可读性和维护性。

总结

通过这个例子,我们学会了如何处理循环数组,并且理解了如何利用模运算来简化循环逻辑。这类问题在实际编程中非常常见,特别是在处理周期性数据或循环队列时。