题目来源:码蹄集
题目描述:
大致思路:
-
遍历输入的n个整数,将每个数存入哈希表中,key为数值,value为该数出现的次数。
-
再次遍历这n个整数,对于每个数x,计算出x-C和x+C的值,然后在哈希表中查找是否存在这两个数。
Python代码实现:
p = 1000003
h = [None] * p
def hash_func(a):
return a % p
def findd(x):
y = hash_func(abs(x))
while h[y] and h[y][0] != x:
y = hash_func(y + 1)
return y
def push(x):
y = findd(x)
if h[y] is None:
h[y] = [x, 1]
else:
h[y][1] += 1
def check(x):
y = findd(x)
if h[y] is None:
return 0
else:
return h[y][1]
n, m = map(int, input().split())
a = list(map(int, input().split()))
for i in range(n):
push(a[i])
ans = 0
for i in range(n):
ans += check(a[i] - m)
print(ans)
C++代码实现:
参考链接:https://blog.csdn.net/CCCCDEV_CCCC/article/details/116106680
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define p 1000003//这就是我们需要取余的数
#define hash(a) a%p//hash函数
using namespace std;
long long n,m,a[p],ans;
struct node{
long long x;//这个位置对应的数
int y;//次数
}h[p];
int findd(long long x)
{//hash关键字,避免冲突的
int y=hash(abs(x));//获取hash值
while(h[y].x&&h[y].x!=x) y=hash(++y);
//避免冲突,往一个存
return y;
}
void push(long long x)
{//映射散列表
int y=findd(x);
h[y].y++;
h[y].x=x;
//存储再散列表中然后次数加一
}
int check(long long x)
{//统计次数
return h[findd(x)].y;
}
int main()
{
cin>>n>>m;
for(long long i=1;i<=n;i++)
cin>>a[i],push(a[i]);
for(long long i=1;i<=n;i++)
ans+=check(a[i]-m);//统计出现次数
cout<<ans<<endl;
return 0;
}
代码提交测试结果:
附B站老师思路讲解:https://www.bilibili.com/video/BV1Ua4y1V7qX/?t=1305.3