查找成绩(向量实现)

题目描述

# T432283 05-30-B01-查找成绩(向量实现)(L4)

## 题目描述

输入一组成绩,共n个,这n个成绩的序号为1~n。再查找成绩a,输出每个成绩a的位置。要求用向量实现。

注意,本题需要用向量的find()函数,find()函数返回的不是元素的下标,而是元素的迭代器。

## 输入格式

输入数据第一行为正整数n,n≤100。第二行有n个整数,范围为0~100,用空格隔开。第三行有一个成绩a,范围为0~100。

## 输出格式

输出成绩a的每个位置,用空格隔开。如果查找不到成绩a,输出no。

## 输入输出样例 #1

### 输入 #1

```
8
90 88 85 88 88 98 95 100
88
```

### 输出 #1

```
2 4 5
```

## 输入输出样例 #2

### 输入 #2

```
8
90 88 85 88 88 98 95 100
99
```

### 输出 #2

```
no
```

## 说明/提示

### 本题出处
本题源自以下教材的编程习题:王桂平, 周祖松, 穆云波, 葛昌威编著. C++趣味编程及算法入门. 北京大学出版社, 2024年出版.

一、题目分析

题目要求输入n个成绩,用向量(vector)存储,然后查找目标成绩a,输出所有a对应的位置(位置从 1 开始)。若未找到,输出no。核心要求是必须使用向量的find()函数,且需注意find()返回的是迭代器而非下标。

二、核心知识点

  1. 向量(vector:动态数组,可存储多个同类型元素,支持下标访问和迭代器操作。
  2. find()函数:位于<algorithm>头文件中,用于在容器中查找指定元素。
    • 语法:find(开始迭代器, 结束迭代器, 目标值)
    • 返回值:若找到,返回指向该元素的迭代器;若未找到,返回结束迭代器(如vector.end())。
  3. 迭代器:类似指针,用于访问容器元素。通过迭代器差值可计算元素下标(迭代器 - 开始迭代器 = 下标)。

三、代码实现步骤详解

1. 引入头文件

cpp

运行

#include <iostream>   // 输入输出流
#include <vector>     // 向量容器
#include <algorithm>  // 包含find()函数
using namespace std;  // 简化命名空间

2. 读取输入数据

cpp

运行

int n, a;  // n:成绩个数;a:目标成绩
cin >> n;  // 读取n

vector<int> s(n);  // 定义大小为n的向量s,存储成绩
for (int i = 0; i < n; i++) {
    cin >> s[i];  // 循环读取n个成绩,存入向量(下标0~n-1)
}

cin >> a;  // 读取目标成绩a

3. 查找并输出位置

cpp

运行

auto it = s.begin();  // 定义迭代器it,初始指向向量第一个元素
bool found = false;   // 标记是否找到目标成绩,初始为false

// 循环查找:每次从当前it位置开始,找到后更新it到下一个位置
while ((it = find(it, s.end(), a)) != s.end()) {
    // 若不是第一次输出,先输出空格(避免结尾多空格)
    if (found) cout << " ";
    
    // 计算位置:迭代器差值(下标)+1(位置从1开始)
    cout << (it - s.begin() + 1);
    
    found = true;  // 标记为已找到
    it++;  // 移动迭代器到下一个位置,避免重复查找当前元素
}

// 若未找到,输出"no"
if (!found) {
    cout << "no";
}

四、关键逻辑解析

  1. 迭代器与下标转换:向量元素的下标从 0 开始,而题目要求位置从 1 开始。通过it - s.begin()可得到元素的下标(如it指向第 2 个元素时,it - s.begin() = 1),加 1 后即为题目要求的位置。

  2. 循环查找逻辑

    • 第一次查找从s.begin()开始,找到后通过it++将迭代器移动到下一个元素,确保下次从新位置开始查找。
    • find()返回s.end(),说明已遍历完所有元素且未找到,循环结束。
  3. 输出格式控制:用found标志判断是否为第一次输出。第一次输出直接打印位置,后续输出前先加空格,避免结尾出现多余空格(如样例 1 输出2 4 5,中间有空格,结尾无空格)。

五、示例测试

样例 1 输入:

plaintext

8
90 88 85 88 88 98 95 100
88
  • 向量s中的元素为[90,88,85,88,88,98,95,100](下标 0~7)。
  • 第一次查找:findbegin()开始,找到下标 1 的 88,位置为1+1=2it移动到下标 2。
  • 第二次查找:find从下标 2 开始,找到下标 3 的 88,位置为3+1=4it移动到下标 4。
  • 第三次查找:find从下标 4 开始,找到下标 4 的 88,位置为4+1=5it移动到下标 5。
  • 后续查找无结果,循环结束。最终输出2 4 5

样例 2 输入:

plaintext

8
90 88 85 88 88 98 95 100
99
  • 向量中无 99,find始终返回end()found保持 false,最终输出no

六、完整代码

cpp

运行

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n, a;
    cin >> n;
    vector<int> s(n);
    for (int i = 0; i < n; i++) {
        cin >> s[i];
    }
    cin >> a;
    
    auto it = s.begin();
    bool found = false;
    while ((it = find(it, s.end(), a)) != s.end()) {
        if (found) cout << " ";
        cout << (it - s.begin() + 1);
        found = true;
        it++;
    }
    
    if (!found) {
        cout << "no";
    }
    
    return 0;
}

大家还可以在我的bilibili(编程题小白日记)搜索 ···0053.查找成绩(向量实现)··· 找到这道题的视频解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值