今日头条笔试题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;
}