力扣题号: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;
}