如何删除具有负整数的数组

时间:2013-11-22 21:35:23

标签: c++ pointers

我试图解决以下问题,

  

给定一个整数数组,每个元素出现三次,除了   为了一个。找到那一个。

当输入都是正数时,我不会得到任何错误,但当输入包含负整数时,行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;
}

1 个答案:

答案 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;
}

然而,这完全不是教师所期望的。