1 条题解

  • 0
    @ 2026-6-19 10:30:32

    📝 题目大意

    给定一个由 .|* 组成的字符串 SS,其中恰好包含 2 个 | 和 1 个 *。判断 * 是否位于两个 | 之间,若是输出 in,否则输出 out

    💡 解题思路

    1. 题目分析N100N \leq 100,数据量极小,直接遍历即可。题目保证字符串中恰好有 2 个 | 和 1 个 *,无需考虑异常情况。
    2. 算法推导
      • 遍历字符串 SS,记录第一个 | 的位置 first、第二个 | 的位置 second 以及 * 的位置 star
      • 判断条件:若 first < star && star < second,说明 * 在两个 | 之间,输出 in;否则输出 out
    3. 边界与细节:由于题目保证恰好有 2 个 | 和 1 个 *firstsecondstar 一定会被赋值,不存在未初始化的情况。|* 的相对位置只有两种情况(* 在中间或不在中间),判断区间开闭不影响结果,因为 * 不会与 | 重合。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),只需遍历一次字符串。
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (C++)

    #include <iostream>
    #include <string>
    using namespace std;
    int main() {
        int N;
        string S;
        cin >> N >> S;
        int first = -1, second = -1, star = -1; // 初始化三个位置标记
        for (int i = 0; i < N; i++) {
            if (S[i] == '|') {
                if (first == -1) {
                    first = i;  // 记录第一个 '|' 的位置
                } else {
                    second = i; // 记录第二个 '|' 的位置
                }
            } else if (S[i] == '*') {
                star = i; // 记录 '*' 的位置
            }
        }
        // 判断 '*' 是否在两个 '|' 之间
        if (first < star && star < second) {
            cout << "in" << endl;
        } else {
            cout << "out" << endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    709
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者