我试图解决以下问题,
给定一个整数数组,每个元素出现三次,除了 为了一个。找到那一个。
当输入都是正数时,我不会得到任何错误,但当输入包含负整数时,行delete index;
会出错,有人知道为什么吗?
即
A[] = {1,2,3,4,1,2,3,4,1,3,4}
工作正常,但A[] = {-2,-2,1,1,-3,1,-3,-3,-4,-2}
没有。
代码如下,
#include <iostream>
#include <map>
class Solution {
public:
int singleNumber(int A[], int n) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
int *index;
std::map<int, int> m;
index = new signed int[(n+1)/3];
int flag = 0;
int result;
for(int i=0; i<n; i++) {
if(m.find(A[i]) == m.end()) {
m[A[i]] = 1;
index[flag] = A[i];
flag++;
} else {
m[A[i]] = m[A[i]] + 1;
}
}
for(int i=0; i<(n+1)/3; i++) {
if(m[index[i]] != 3) {
result = index[i];
}
}
delete index;
return result;
}
};
int main()
{
Solution s;
int A[] = {1,2,3,4,1,2,3,4,1,3,4};
int result = s.singleNumber(A, 11);
std::cout <<result;
return 0;
}
答案 0 :(得分:1)
第一个数组包含11个元素,这使得行index = new signed int[(n+1)/3];
分配一个(11 + 1)/ 3 = 4个元素的数组。第二个数组包含10个元素,这使得该行分配一个(10 + 1)/ 3 = 3个元素的数组。
3个元素不足以记录A
(-4,-3,-2和1)中的唯一值,因此您会溢出数组。
您应该至少分配(n+2)/3
个元素。测试flag
的值以确保它永远不会超过数组边界也是谨慎的。如果输入数组服从约束,那么除了一个元素之外的每个元素都会出现三次(假设这意味着它会出现一次或两次,而不是四次或更多次),但是你可以依赖于遵守的约束吗?
此外,循环for(int i=0; i<(n+2)/3; i++)
不足以迭代添加到地图中的所有元素。您应确保遍历m
的所有成员。
顺便说一句,singleNumber
可以在没有任何动态分配或库调用的情况下以更有趣的方式实现:
int singleNumber(int A[], int n) {
int b = 0, c = 0;
while (n--)
{
b ^= A[n] & c;
c ^= A[n] & ~b;
}
return c;
}
然而,这完全不是教师所期望的。