排查判断两同长度无序数组元素是否一致的C语言代码问题
问题分析与修复方案
代码核心漏洞
你的代码仅验证了数组A的每个元素存在于数组B中,但没有校验元素的出现次数是否完全匹配。举个典型反例:
输入:
2 1 1 1 2
你的代码会返回yes,但实际应返回no——因为A包含两个1,而B仅包含一个1,元素的数量不匹配,这就是第4个测试用例失败的原因。
修复思路
有两种高效的修复方式:
方式1:排序后逐元素对比
将两个数组分别排序,然后逐个位置对比元素是否完全一致。若所有位置元素都相同,说明两个数组的元素(含出现次数)完全匹配。
方式2:标记已匹配元素(避免重复使用)
遍历A的每个元素时,在B中找到对应元素后,标记该元素已被使用(比如用额外的标记数组),防止后续元素重复匹配同一个B中的元素。
修复后代码(方式2示例)
#include <stdio.h> #include <stdlib.h> int main() { int n; scanf("%d", &n); long int a[n], b[n]; int used[n]; // 标记B中元素是否已被匹配 for (int i = 0; i < n; i++) { scanf("%ld", &a[i]); used[i] = 0; // 初始化标记为未使用 } for (int i = 0; i < n; i++) { scanf("%ld", &b[i]); } int same = 1; for (int j = 0; j < n; j++) { int found = 0; for (int k = 0; k < n; k++) { // 仅匹配未被使用的元素 if (!used[k] && a[j] == b[k]) { found = 1; used[k] = 1; // 标记为已使用 break; // 找到后立即退出内层循环 } } if (!found) { same = 0; break; } } printf("%s\n", same ? "yes" : "no"); return 0; }
修复后代码(方式1示例)
#include <stdio.h> #include <stdlib.h> // qsort所需的比较函数 int compare(const void *a, const void *b) { return (*(long int*)a - *(long int*)b); } int main() { int n; scanf("%d", &n); long int a[n], b[n]; for (int i = 0; i < n; i++) { scanf("%ld", &a[i]); } for (int i = 0; i < n; i++) { scanf("%ld", &b[i]); } // 对两个数组排序 qsort(a, n, sizeof(long int), compare); qsort(b, n, sizeof(long int), compare); int same = 1; for (int i = 0; i < n; i++) { if (a[i] != b[i]) { same = 0; break; } } printf("%s\n", same ? "yes" : "no"); return 0; }
内容的提问来源于stack exchange,提问作者Didar004
相关产品推荐
相关产品推荐

