哈希表-两个数组的交集

42 篇文章 2 订阅
22 篇文章 0 订阅
        力扣题号:349. 两个数组的交集

一、题目描述

给定两个数组,编写一个函数来计算它们的交集。

二、示例

三、求解思路

如果没有限制数值大小,使用自定义哈希表,或者使用现有的哈希表。

如果题目都限制了数值的大小,使用数组来做哈希的题目,

四、代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 自定义数组
typedef struct array {
	int *arr = NULL;
	int size = 0;
}Array;

// 自定义哈希表
typedef struct hash {
	int arr[10005];
}Hash;
// 映射函数
void voidreflection(Hash& H,int n) {
	
	int n1 = n % 1000;
	while (H.arr[n1] != -1 && H.arr[n1] != n) {
		n1++;
	}
	if (H.arr[n1] == n) { // 元素重复
		return;
	}
	H.arr[n1] = n;
}
// 查找哈希表中是否有该元素
int find(Hash& H, int n) {
	int n1 = n % 1000;
	while (H.arr[n1] != n && H.arr[n1]!=-1) {
		n1++;
	}
	if (H.arr[n1] == n) {
		return 1;
	}
	return 0;
}

// 哈希表法(自定义哈希表)
Array hash_method(int *arr1, int len1, int* arr2, int len2) {
	Hash H;
	for (int i = 0; i < 1005; i++) {
		H.arr[i] = -1;
	}
	for (int i = 0; i < len1; i++) {
		voidreflection(H, arr1[i]);
	}
	Array new_arr;
	new_arr.arr = NULL;
	int size = 0;
	for (int i = 0; i < len2; i++) {
		if (find(H, arr2[i])) {
			if (new_arr.arr == NULL) {
				new_arr.arr = (int*)malloc(sizeof(int) * (++size));
				new_arr.arr[size - 1] = arr2[i];
			}
			else
			{	
				int flag = 0;
				for (int j = 0; j < size; j++) {
					if (new_arr.arr[j] == arr2[i]) {
						flag = 1;
					}
				}
				if (flag == 0) {
					new_arr.arr = (int*)realloc(new_arr.arr, sizeof(int) * (++size));
					new_arr.arr[size - 1] = arr2[i];
				}
			}
		}
	}
	new_arr.size = size;
	return new_arr;
}

// 哈希表法 使用自定义数组 0 ~ 1500
Array hash_method1(int* arr1, int len1, int* arr2, int len2) {
	int hash[1500] = { 0 };
	for (int i = 0; i < 1500; i++) {
		hash[i] = -1;
	}
	for (int i = 0; i < len1; i++) {
		hash[arr1[i]] = arr1[i];
	}

	Array new_arr;
	new_arr.arr = NULL;
	int size = 0;
	for (int i = 0; i < len2; i++) {
		if (hash[arr2[i]] != -1) {
			if (new_arr.arr == NULL) {
				new_arr.arr = (int*)malloc(sizeof(int) * (++size));
				new_arr.arr[size - 1] = arr2[i];
			}
			else
			{
				int flag = 0;
				for (int j = 0; j < size; j++) {
					if (new_arr.arr[j] == arr2[i]) {
						flag = 1;
					}
				}
				if (flag == 0) {
					new_arr.arr = (int*)realloc(new_arr.arr, sizeof(int) * (++size));
					new_arr.arr[size - 1] = arr2[i];
				}
			}
		}
	}
	new_arr.size = size;

	return new_arr;
}

void Print1(int* arr, int size) {
	for (int i = 0; i < size; i++) {
		printf("%5d", arr[i]);
	}
	printf("\n");
}

void Print2(Array& A) {
	for (int i = 0; i < A.size; i++) {
		printf("%5d", A.arr[i]);
	}
	printf("\n");
}

int main() {

	int arr1[] = { 0,52,98,15,52,52,105,400,395,84,77,89,512,45,88,9,1034};
	int arr2[] = { 52,65,75,81,65,105,77,152,512,52,1034,400 };
	int len1 = sizeof(arr1)/sizeof(int);
	int len2 = sizeof(arr2) / sizeof(int);
	Print1(arr1, len1);
	Print1(arr2, len2);

	printf("自定义哈希表(数值可大于数组长度):\n");
	Array arr = hash_method(arr1, len1,arr2, len2);
	Print2(arr);

	printf("\n使用数组定义哈希表(数值不可大于数组长度):\n");
	arr = hash_method1(arr1, len1, arr2, len2);
	Print2(arr);

	return 0;
}

五、运行结果

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值