📅  最后修改于: 2023-12-03 15:12:46.408000             🧑  作者: Mango
这是一个关于编程的问题。假设你是一位程序员,给你一个长度为n的整数数组nums。你需要实现一个函数bool check(int *nums, int n),该函数返回true表示nums中所有数都是成对出现的,否则返回false。例如,对于数组nums=[1,2,3,2,1],函数check(nums,5)应该返回true。如果nums=[1,3,2,1,5],函数check(nums,5)应该返回false。
这个问题可以用哈希表来解决。我们用一个unordered_map<int,int> counts来记录nums中每个数出现的次数。如果一个数出现次数为偶数,就说明它出现了成对的次数。因此,我们只需要检查counts中所有数的出现次数是否都是偶数即可。如果counts中出现了奇数次数的数,就说明有数没有成对,此时我们应该返回false。
下面是一个实现check函数的代码:
bool check(int *nums, int n) {
unordered_map<int,int> counts;
for (int i = 0; i < n; i++) {
counts[nums[i]]++;
}
for (auto it = counts.begin(); it != counts.end(); it++) {
if (it->second % 2 == 1) {
return false;
}
}
return true;
}
下面是几组测试用例:
int main() {
int nums1[] = {1,2,3,2,1};
int nums2[] = {1,3,2,1,5};
int nums3[] = {4,4,4,4};
int nums4[] = {-1,3,2,-1,5,-1,3,2,5};
assert(check(nums1,5) == true);
assert(check(nums2,5) == false);
assert(check(nums3,4) == true);
assert(check(nums4,9) == true);
return 0;
}
这个问题可以用哈希表来解决,时间复杂度是O(n),空间复杂度是O(n)。由于哈希表的查询时间是常数级别的,因此这个算法的性能是比较不错的。