有一道关于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;
}
}
}
这很好解决啊,最死的办法,就是循环遍历,进行统计次数
可以借助桶排序思路或者直接哈希
--------------------------------------------分割线------------------------------------------------
下面的代码是具体的实现,注释加的挺明白的
#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; // 返回该数应该的存储位置
}