查找特定的值

GitHub跳转原题关系图返回列表

无序序列线性扫描,找到目标值第一次出现的位置并输出下标,未找到输出 -1。

OJ: roj

题目 ID: 1110

难度:入门

标签:线性查找模拟

创建: 2026-09-29 19:14

更新: 2026-10-05 01:41

题目描述

在一个下标从 11 开始的序列中查找给定值,输出它第一次出现的位置。输入三行:第一行为序列长度 nn(1⩽n⩽100001 \leqslant n \leqslant 10000);第二行为 nn 个绝对值不超过 1000010000 的整数;第三行为待查找的整数 xx(∣x∣⩽10000|x| \leqslant 10000)。输出 xx 第一次出现的下标,若不存在则输出 -1。 样例输入 5、2 3 6 7 3、3,输出 2。

思路

序列无序,不能二分,只能从左到右线性扫描:遇到的第一个等于 xx 的元素下标就是答案,扫完仍未命中则输出 -1;注意下标从 11 开始、命中后立即停止,复杂度 O(n)O(n)。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-01-09 10:00
# update_at: 2026-01-09 10:00

import sys


def solve() -> None:
    data = iter(map(int, sys.stdin.buffer.read().split()))
    n = next(data)
    a = [next(data) for _ in range(n)]
    x = next(data)

    # next + enumerate 在找到第一个匹配值时立刻短路,下标保持从 1 开始。
    pos = next((i for i, v in enumerate(a, 1) if v == x), -1)
    print(pos)


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 01:40
 * update_at: 2026-10-05 01:40
 */
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAXN = 10005;
int seq[MAXN]; // seq[i] 存序列第 i 个元素,下标从 1 开始与题面一致

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    ll n, x;
    cin >> n;
    for (ll i = 1; i <= n; i++) {
        cin >> seq[i];
    }
    cin >> x;

    // 序列无序,只能从左到右线性扫描,遇到的第一个匹配即“第一次出现”的位置
    ll answer = -1;
    for (ll i = 1; i <= n; i++) {
        if (seq[i] == x) {
            answer = i;
            break;
        }
    }

    cout << answer << "\n";
    return 0;
}