2013-11-22 34 views
-1

我試圖解決以下問題的一個陣列,如何刪除與負整數

鑑於整數數組,每個元素出現,除了 一三次。找到那一個。

當輸入都是積極的,我不會得到任何錯誤,但是當輸入包含負整數,該行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

使用delete [] index',而不是'delete index'。不知道這是否會解決你的問題,但你需要將array new與array delete匹配。 –

+0

什麼是錯誤?你沒有告訴我們你收到的錯誤信息。 –

+0

爲什麼你甚至有'int []'數組? 'map '是你需要解決的問題。 –

回答

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

然而,這完全不是你的老師期待。

+0

你說得對,但是爲什麼A [] = {1}在'delete index'行也出錯? – UnkDrew

+0

@UnkDrew:這種情況有同樣的問題:「(n + 1)/ 3」評估爲「2/3」,然後評估爲「0」,因此您請求零元素,但您需要一個元素來保存1。 –

+0

我的不好,我沒有提到我已經把它改成'(n + 2)/ 3',它依然不起作用。 – UnkDrew