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

原文地址 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++。


   
  1. #include<iostream>
  2. #include<unordered_map>
  3. using namespace std;
  4. int main()
  5. {
  6. int n, k;
  7. cin >> n >> k;
  8. vector< int> ivec(n, 0);
  9. unordered_map< int, int> nums;
  10. int cnt = 0;
  11. for ( auto &m : ivec)
  12. cin >> m;
  13. for ( auto m:ivec)
  14. nums[m]++;
  15. for ( auto m : nums)
  16. {
  17. if (k == 0 && m.second > 1)
  18. cnt++;
  19. if (k > 0 && nums.count(k + m.first) > 0)
  20. cnt++;
  21. }
  22. cout << cnt << endl;
  23. return 0;
  24. }

另解


   
  1. #include<iostream>
  2. #include<vector>
  3. #include<map>
  4. using namespace std;
  5. int main()
  6. {
  7. int n, k;
  8. cin >> n >> k;
  9. vector< int> ivec(n, 0);
  10. for ( auto &m : ivec)
  11. cin >> m;
  12. map< int, int> nums;
  13. for ( auto m : ivec)
  14. nums[m]++;
  15. int cnt = 0;
  16. auto it = nums.begin();
  17. while (it!=nums.end())
  18. {
  19. if (k == 0 && it->second > 1)
  20. cnt++;
  21. if (k > 0 && nums.count(k + it->second) > 0)
  22. cnt++;
  23. it++;
  24. }
  25. cout << cnt << endl;
  26. return 0;
  27. }

错误解法:

方法一:set排序去重 (关联容器set(关键词默认升序不重复)不支持下标访问,需通过迭代器访问set中的元素;没有push_back函数,通过insert函数添加元素)


   
  1. // set排序去重
  2. #include<iostream>
  3. #include<vector>
  4. #include<set>
  5. using namespace std;
  6. int main()
  7. {
  8. int n, k;
  9. cin >> n >> k;
  10. vector< int> ivec(n, 0);
  11. for ( auto &m : ivec)
  12. cin >> m;
  13. int cnt = 0;
  14. set< int> s;
  15. for ( auto m : ivec)
  16. s.insert(ivec.begin(), ivec.end());
  17. for ( auto it1 = s.begin(); it1 != s.end(); it1++)
  18. {
  19. for ( auto it2 = s.begin(); it2 != s.end(); it2++)
  20. {
  21. if (it1 != it2 && *it2 - *it1 == k)
  22. cnt++;
  23. }
  24. }
  25. cout << cnt << endl;
  26. return 0;
  27. }

方法二:sort函数排序去,迭代去重,resize函数改变vector大小


   
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. using namespace std;
  5. int main()
  6. {
  7. int n, k;
  8. cin >> n >> k;
  9. vector< int> ivec(n, 0);
  10. for ( auto &m : ivec)
  11. cin >> m;
  12. sort(ivec.begin(), ivec.end()); // 头文件 #include<algorithm>
  13. int cnt = 0;
  14. vector< int> temp(n, 0);
  15. temp[ 0] = ivec[ 0];
  16. int count = 1;
  17. for ( size_t i = 1, index = 1; i < ivec.size(); i++)
  18. {
  19. if (ivec[i] != ivec[i - 1])
  20. {
  21. temp[index++] = ivec[i];
  22. count++;
  23. }
  24. }
  25. temp.resize(count);
  26. for ( size_t i = 0; i < temp.size(); i++)
  27. {
  28. for ( size_t j = 0; j < temp.size(); j++)
  29. {
  30. if (j != i&&temp[j] - temp[i] == k)
  31. cnt++;
  32. }
  33. }
  34. cout << cnt << endl;
  35. return 0;
  36. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值