题目链接

小红的多彩糖葫芦

题目描述

小红有一串多彩糖葫芦,按从上到下的顺序由一个字符串表示。

她从上往下吃,但有一个强迫症:绝不会连续吃两个相同颜色的糖葫芦。

一旦她发现下一颗糖葫芦和刚吃过的颜色相同,她就会把整串都丢掉。

我们需要计算她最终会吃掉几颗糖葫芦。

解题思路

这是一个简单的模拟问题,我们只需要按照题目的描述,模拟小红吃糖葫芦的过程即可。

核心逻辑

我们可以从头开始遍历代表糖葫芦颜色的字符串,模拟小红的决策过程。

  1. 初始化

    • 如果字符串为空,小红一颗也吃不到,答案为 0。
    • 如果字符串不为空,小红至少会吃第一颗。因此,我们可以设置一个计数器 eaten_count,初始值为 1。
  2. 遍历检查

    • 我们从第二颗糖葫芦(字符串索引为 1)开始,依次向后检查。
    • 在每一步,我们比较当前糖葫芦的颜色 s[i] 和它前一颗(也就是刚吃过的那颗)的颜色 s[i-1]
    • 如果 s[i] == s[i-1],说明小红遇到了相同颜色的糖葫芦,她会停下来。此时,我们直接结束遍历。
    • 如果 s[i] != s[i-1],说明颜色不同,小红可以继续吃。我们将 eaten_count 加 1。
  3. 最终结果

    • 遍历结束后,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()

算法及复杂度

  • 算法:模拟 / 线性扫描

  • 时间复杂度: ,其中 是字符串的长度。我们最多只需要遍历字符串一次。

  • 空间复杂度: ,用于存储输入的字符串。