题干描述:
给你两个下标从 0 开始的整数数组 nums1
和 nums2
,它们分别含有 n
和 m
个元素。请你计算以下两个数值:
answer1
:使得nums1[i]
在nums2
中出现的下标i
的数量。answer2
:使得nums2[i]
在nums1
中出现的下标i
的数量。
返回 [answer1, answer2]
。
示例 1:
输入:nums1 = [2,3,2], nums2 = [1,2]
输出:[2,1]
解释:
示例 2:
输入:nums1 = [4,3,2,3,1], nums2 = [2,2,5,2,3,6]
输出:[3,4]
解释:
nums1
中下标在 1,2,3 的元素在 nums2
中也存在。所以 answer1
为 3。
nums2
中下标在 0,1,3,4 的元素在 nums1
中也存在。所以 answer2
为 4。
示例 3:
输入:nums1 = [3,4,2,3], nums2 = [1,5]
输出:[0,0]
解释:
nums1
和 nums2
中没有相同的数字,所以答案是 [0,0]。
题干分析:
已知题目要求计算以下两个数值:
1.answer1:计算nums1【i】在nums2中出现的下标i的数量
2.answer2:计算num2【i】nums1中出现的下标i的数量
具体来说就是,对于每个数组中的每个元素,我们需要检查它是否子啊另一个数组中出现,并且如果出现了,则计数。
解题步骤:
- 遍历nums1中的每个元素,检查它是否在nums2中出现,如果出现则answer1+1。
- 遍历nums2中的每个元素,检查它是否在nums1中出现,如果出现则answer2+1。
相关的完整的实现代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* 函数:findIntersectionValues
* 相关参数:
* nums1:第一个数组
* nums1Size:第一个数组的大小
* nums2:第二个数组
* numsSize:第二个数组的大小
* returnSize:返回数组的大小(输出参数)
*/
int* findIntersectionValues(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
//分配大小为2的数组内存,并初始化为0
int* ret = (int*)malloc(sizeof(int) * 2);
memset(ret, 0, sizeof(int) * 2);
//计算nums1中的元素子啊nums2中出现的次数
for (int i = 0; i < nums1Size; i++)
{
for (int j = 0; j < nums2Size; j++) {
if (nums1[i] == nums2[j])
{
ret[0]++;
break;//一旦找到匹配元素,跳出内存循环
}
}
}
//计算nums2中的元素在nums1中出现的次数
for (int i = 0; i < nums2Size; i++)
{
for (int j = 0; j < nums1Size; j++) {
if (nums2[i] == nums1[j])
{
ret[1]++;
break;//一旦找到匹配元素,跳出内存循环
}
}
//设置返回的数组大小为2
*returnSize = 2;
return ret;
}
}
int main() {
// 定义并初始化两个数组
int nums1[] = { 1, 2, 2, 1 };
int nums2[] = { 2, 2 };
int nums1Size = sizeof(nums1) / sizeof(nums1[0]);
int nums2Size = sizeof(nums2) / sizeof(nums2[0]);
int returnSize;
// 调用findIntersectionValues函数
int* intersection = findIntersectionValues(nums1, nums1Size, nums2, nums2Size, &returnSize);
// 打印结果
printf("Intersection counts: nums1 in nums2: %d, nums2 in nums1: %d\n", intersection[0], intersection[1]);
// 释放分配的内存
free(intersection);
return 0;
}
这道题整体思路比较简单更多的是对题干信息的理解。