问题描述
假设有一群朋友围成一个圈,每个人背上贴了一个字母,要么是 '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; // 返回总共数过的人数
}
代码解释
-
初始化变量:
countA用于记录遇到 'A' 的次数。totalPeopleCounted用于记录总共数过的人数。
-
循环遍历:
- 使用
for循环遍历数组,直到countA达到k。 - 使用
i % n来处理循环数组,确保在数组末尾后可以从头开始继续计数。 - 如果当前字符是 'A',则增加
countA。 - 每次循环都增加
totalPeopleCounted。
- 使用
-
返回结果:
- 当
countA达到k时,停止循环并返回totalPeopleCounted。
- 当
技巧分享
-
模运算:
- 在处理循环数组时,使用模运算可以非常方便地实现循环效果。例如,
i % n可以确保索引始终在有效范围内。
- 在处理循环数组时,使用模运算可以非常方便地实现循环效果。例如,
-
条件控制:
- 通过设置循环条件
countA < k,我们可以确保在达到目标之前一直进行循环。
- 通过设置循环条件
-
简洁性:
- 保持代码简洁明了,避免不必要的复杂逻辑,这样可以提高代码的可读性和维护性。
总结
通过这个例子,我们学会了如何处理循环数组,并且理解了如何利用模运算来简化循环逻辑。这类问题在实际编程中非常常见,特别是在处理周期性数据或循环队列时。