原文地址 https://blog.youkuaiyun.com/lizhentao0707/article/details/80939737
今日头条笔试题1——在n个元素的数组中,找到差值为k的数字对去重后的个数
开始想的方法一和方法二排序去重均漏掉了下列输入输出情况
输入 :4 0
1 2 1 2
正确输出:2
方法一方法二输出:0 (去重了)
正确解法:
思路:用unordered_map<int,int> (<值val,次数cnt>)统计每个数出现的次数,每个值加上k后在unordered_map中查找与(val+k)相等的数,查到计数器cnt就加一。
分两种情况:
(1) k=0;查找出现次数大于1的val,找到就cnt++;
(2) k>0;查找出现次数大于1的(k+val),找到就cnt++。
-
#include<iostream>
-
#include<unordered_map>
-
-
using
namespace
std;
-
-
int main()
-
{
-
int n, k;
-
cin >> n >> k;
-
vector<
int> ivec(n,
0);
-
unordered_map<
int,
int> nums;
-
int cnt =
0;
-
for (
auto &m : ivec)
-
cin >> m;
-
for (
auto m:ivec)
-
nums[m]++;
-
for (
auto m : nums)
-
{
-
if (k ==
0 && m.second >
1)
-
cnt++;
-
if (k >
0 && nums.count(k + m.first) >
0)
-
cnt++;
-
}
-
cout << cnt <<
endl;
-
return
0;
-
}
另解
-
#include<iostream>
-
#include<vector>
-
#include<map>
-
-
using
namespace
std;
-
-
int main()
-
{
-
int n, k;
-
cin >> n >> k;
-
vector<
int> ivec(n,
0);
-
for (
auto &m : ivec)
-
cin >> m;
-
map<
int,
int> nums;
-
for (
auto m : ivec)
-
nums[m]++;
-
int cnt =
0;
-
auto it = nums.begin();
-
while (it!=nums.end())
-
{
-
if (k ==
0 && it->second >
1)
-
cnt++;
-
if (k >
0 && nums.count(k + it->second) >
0)
-
cnt++;
-
it++;
-
}
-
cout << cnt <<
endl;
-
return
0;
-
}
错误解法:
方法一:set排序去重 (关联容器set(关键词默认升序不重复)不支持下标访问,需通过迭代器访问set中的元素;没有push_back函数,通过insert函数添加元素)
-
// set排序去重
-
#include<iostream>
-
#include<vector>
-
#include<set>
-
-
using
namespace
std;
-
-
int main()
-
{
-
int n, k;
-
cin >> n >> k;
-
vector<
int> ivec(n,
0);
-
for (
auto &m : ivec)
-
cin >> m;
-
int cnt =
0;
-
set<
int> s;
-
for (
auto m : ivec)
-
s.insert(ivec.begin(), ivec.end());
-
for (
auto it1 = s.begin(); it1 != s.end(); it1++)
-
{
-
for (
auto it2 = s.begin(); it2 != s.end(); it2++)
-
{
-
if (it1 != it2 && *it2 - *it1 == k)
-
cnt++;
-
}
-
}
-
cout << cnt <<
endl;
-
return
0;
-
}
方法二:sort函数排序去,迭代去重,resize函数改变vector大小
-
#include<iostream>
-
#include<algorithm>
-
#include<vector>
-
-
using
namespace
std;
-
-
int main()
-
{
-
int n, k;
-
cin >> n >> k;
-
vector<
int> ivec(n,
0);
-
for (
auto &m : ivec)
-
cin >> m;
-
sort(ivec.begin(), ivec.end());
// 头文件 #include<algorithm>
-
int cnt =
0;
-
vector<
int> temp(n,
0);
-
temp[
0] = ivec[
0];
-
int count =
1;
-
for (
size_t i =
1, index =
1; i < ivec.size(); i++)
-
{
-
if (ivec[i] != ivec[i -
1])
-
{
-
temp[index++] = ivec[i];
-
count++;
-
}
-
}
-
temp.resize(count);
-
for (
size_t i =
0; i < temp.size(); i++)
-
{
-
for (
size_t j =
0; j < temp.size(); j++)
-
{
-
if (j != i&&temp[j] - temp[i] == k)
-
cnt++;
-
}
-
}
-
cout << cnt <<
endl;
-
return
0;
-
}