今日头条笔试题——在n个元素的数组中,找到差值为k的数字对去重后的个数

今日头条笔试题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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值