在大量数据中查找重复的两个数
2023-12-13 13:36:13
在大量数据中查找重复的两个数
bitmap 方法
必须是:1-n 连续数字
int findDuplicate_bitmap(vector<int> &nums)
{
std::cout << "findDuplicate_bitmap: " << std::endl;
int idx, bit;
int numOfBytes = (nums.size() - 1) / 8 + 1;
char *bytes = new char[numOfBytes];
memset(bytes, 0, numOfBytes * sizeof(char));
for (int i = 0; i < nums.size(); ++i)
{
idx = nums[i] / 8, bit = nums[i] % 8;
if (!(bytes[idx] & (1 << bit)))
bytes[idx] |= (1 << bit);
else
return nums[i];
}
return -1;
}
hash 方法
把数字作为hash 表的索引,可以是不连续数字
int findDuplicate_hash(vector<int> &nums)
{
std::cout << "findDuplicate_hash: " << std::endl;
unordered_map<int, int> count; // 创建哈希表
int numsSize = nums.size();
for (int i = 0; i < numsSize; i++)
{
if (count.find(nums[i]) != count.end())
{ // 如果该元素已经在哈希表中出现过
return nums[i]; // 返回重复数字
}
else
{
// 否则,将该元素添加到哈希表中并增加计数器
count[nums[i]]++;
}
}
return -1; // 未找到重复数字,返回 -1 或其他特殊值
}
main函数测试
int main(int argc, char **argv)
{
std::vector<int> nums = {1,2,3,4,5,6,7,8,9,10,11,2,13,14};
std::vector<int> nums2 = {1, 3, 4, 48, 421, 41, 84, 814, 5, 887, 5485, 35, 54, 5485};
auto printFunc = [=](std::vector<int> &nums)
{
for (auto num : nums)
{
std::cout << num << " ";
}
std::cout << std::endl;
};
printFunc(nums);
int ret = findDuplicate_bitmap(nums);
std::cout << "findDuplicate: " << ret<<std::endl;
printFunc(nums2);
int ret2 = findDuplicate_hash(nums2);
std::cout << "findDuplicate: " << ret2<<std::endl;
return 0;
}
输出:
1 2 3 4 5 6 7 8 9 10 11 2 13 14
findDuplicate_bitmap:
findDuplicate: 2
1 3 4 48 421 41 84 814 5 887 5485 35 54 5485
findDuplicate_hash:
findDuplicate: 5485
文章来源:https://blog.csdn.net/WMX843230304WMX/article/details/134945346
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!