关于C++的数组指针问题,判断数字是否出现在数组中并输出

有一道关于C++的练习题,题目要求是
输入两个数字N和M,N表示输入的数字个数,M是要测试的数字的个数
如果测试的数字在第一组数字中出现,则输出他的序号数,如果第一组数字种该数字有重复,则输出最后一位的序号数。
若没有该数字,则是输出0.
例如:
输入:
3 3
1 3 5
1 5 7
输出:
1
3
0
输入:4 2
1 1 3 3
1 3
输出:
2
4
输入:
10 8
0 0 0 1 2 2 2 2 3 3
0
1
2
3
3
2
1
0


我试着设了两个数组,但是不知道在输出的时候怎么弄。。而且0还总是重复输出。
希望各位可以给一些指导或者完整代码最好啦!谢谢大家

选用map类型存储数组和下标就行了,每次读入先判断有没有,再选择更新或插入
参考链接:

#include<iostream>
#include<map>
using namespace std;
int main() {
    map<int, int>Map;
    int n, m,num;
    cin >> n >> m;
    map<int, int>::iterator l_it;;
    for (int i = 0; i < n; i++) {
        cin >> num;
        l_it = Map.find(num);
        if (l_it == Map.end()) {
            Map.insert(pair <int, int>(num, i + 1));
        }
        else {
            Map[num] = i + 1;
        }
    }
    for (int i = 0; i < m; i++) {
        cin >> num;
        l_it = Map.find(num);
        if (l_it == Map.end()) {
            cout << 0 << endl;
        }
        else {
            cout << l_it->second << endl;
        }
    }
}

img

这很好解决啊,最死的办法,就是循环遍历,进行统计次数

可以借助桶排序思路或者直接哈希

--------------------------------------------分割线------------------------------------------------

下面的代码是具体的实现,注释加的挺明白的

#include <iostream>
#define DEBUG
#define null -1
#define N 200009    // 需要是一个质数
using namespace std;

// 为了可以存入序号,所以定义一个结构体
typedef struct elem
{
    int num;    // 存入的数
    int id;     // 该数最后一次出现的序号(如果该数存在的话)
}elem;

elem b[N];

int a[N];   // 为了演示桶的思路创建
int n, m;

void method1(void);

void method2(void);
int find(int x);

int main(void)
{
    cin >> n >> m;
    // 如果爆TLE的话可以把输入输出换成scanf和printf
    // method1();
    method2();
    return 0;
}

// 借住桶的思路,缺点是会浪费大量空间并且处理数的范围也有限
void method1(void)
{
    int t = 0;
    const int d = 100000;   // 偏移量,为了使负数也可以使用

    for (int i = 1; i <= n; i++)
    {
        cin >> t;
        a[t + d] = i;
    }
    for (int i = 0; i < m; i++)
    {
        cin >> t;
        cout << a[t + d] << endl;
    }
}

// 开放地址法处理冲突来进行哈希
void method2(void)
{
    // 先把散列表的状态都搞成空
    for (int i = 0; i < N; i++)
        b[i].num = null;
    int t;  // 临时的读入读出数据的量

    // 将数据插入散列表
    for (int i = 1; i <= n; i++)
    {
        cin >> t;
        b[find(t)] = {t, i};
    }

    // 查询散列表中的数据
    for (int i = 0; i < m; i++)
    {
        cin >> t;
        if (b[find(t)].num == null)     // 表中找不到数据直接输出0
            cout << 0 << endl;
        else
            cout << b[find(t)].id << endl;
    }
}

// 找到插入散列表的位置
int find(int x)
{
    int t = (x % N + N) % N;    // 为了处理负数的情况所以采用这种哈希方式
    
    // 在哈希表中不断地找位置
    while (b[t].num != null && b[t].num != x)
    {
        t++;    // 线性探测
        if (t == N) // 当到达表尾时,重新定位到表头
            t = 0;
    }
    return t;   // 返回该数应该的存储位置
}