题目链接
题目描述
小红有一串多彩糖葫芦,按从上到下的顺序由一个字符串表示。
她从上往下吃,但有一个强迫症:绝不会连续吃两个相同颜色的糖葫芦。
一旦她发现下一颗糖葫芦和刚吃过的颜色相同,她就会把整串都丢掉。
我们需要计算她最终会吃掉几颗糖葫芦。
解题思路
这是一个简单的模拟问题,我们只需要按照题目的描述,模拟小红吃糖葫芦的过程即可。
核心逻辑
我们可以从头开始遍历代表糖葫芦颜色的字符串,模拟小红的决策过程。
-
初始化:
- 如果字符串为空,小红一颗也吃不到,答案为 0。
- 如果字符串不为空,小红至少会吃第一颗。因此,我们可以设置一个计数器
eaten_count
,初始值为 1。
-
遍历检查:
- 我们从第二颗糖葫芦(字符串索引为 1)开始,依次向后检查。
- 在每一步,我们比较当前糖葫芦的颜色
s[i]
和它前一颗(也就是刚吃过的那颗)的颜色s[i-1]
。 - 如果
s[i] == s[i-1]
,说明小红遇到了相同颜色的糖葫芦,她会停下来。此时,我们直接结束遍历。 - 如果
s[i] != s[i-1]
,说明颜色不同,小红可以继续吃。我们将eaten_count
加 1。
-
最终结果:
- 遍历结束后,
eaten_count
的值就是小红最终吃掉的糖葫芦数量。
- 遍历结束后,
这个过程本质上是寻找第一个连续相同字符出现的位置。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s;
cin >> s;
if (s.empty()) {
cout << 0 << endl;
return 0;
}
int eaten_count = 1;
for (int i = 1; i < s.length(); ++i) {
if (s[i] == s[i - 1]) {
break;
}
eaten_count++;
}
cout << eaten_count << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
if (s == null || s.isEmpty()) {
System.out.println(0);
return;
}
int eatenCount = 1;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == s.charAt(i - 1)) {
break;
}
eatenCount++;
}
System.out.println(eatenCount);
}
}
import sys
def solve():
s = sys.stdin.readline().strip()
if not s:
print(0)
return
eaten_count = 1
for i in range(1, len(s)):
if s[i] == s[i-1]:
break
eaten_count += 1
print(eaten_count)
solve()
算法及复杂度
-
算法:模拟 / 线性扫描
-
时间复杂度:
,其中
是字符串的长度。我们最多只需要遍历字符串一次。
-
空间复杂度:
,用于存储输入的字符串。