2014-01-06 223 views
0

我是一個IT人,我們將有一個程序測試,其中測試程序將測試我們的程序。其中一個粒子examp的是,我們得到青睞和人民的工資,我們要算differet年齡的人有多少計算數組中的不同元素

我的代碼看起來像這樣 的STRUC:

struct input 
{ 
    int emp_age, emp_paid; 
}; 

這是代碼, n是代表所有的人

int diff_sum (int n, input* t) 
{ 
    int uniq_num = n; 

    for(int i = 0; i < n; i++) 
     { 
      for(int j = i; j < n; j++) 
       { 
        if((t[j].emp_age == t[i].emp_age) && (i!=j)) 
         { 
          uniq_num = uniq_num - 1; 
         } 
       } 
     } 
    cout << uniq_num << endl; 
    return 0; 
} 

程序測試10次,有的說放出來是好的,但對於一些測試它說這是錯了看跌期權的數量。我不知道測試引擎是如何工作的,我也不知道問題是什麼。

+0

你應該做的首先是展示一個答案或記錄輸入和獲取產生不正確的特定輸入(S)結果。然後你知道從哪裏開始尋找。 – dutt

回答

1

一可能是,所有的元素添加到一個STL容器具有唯一值:

int diff_sum (int n, input* t) 
{ 
    std::set<int> ages; 
    for(int i = 0; i < n; i++) 
     ages.insert(t[i].emp_age); 

    return ages.size(); 
} 
+1

我想你的意思是'std :: set'。 – BoBTFish

+0

該死的。我的意思是剛剛寫下了名單。謝謝。 –

3

考慮這個:10 10 10。 想想ij截至元素指向:

uniq_num = 3 
10 10 10 
i j => uniq_num = 2 

10 10 10 
i  j => uniq_num = 1 

10 10 10 
    i j => uniq_num = 0!!!! 

所以我們看到的是,在第二外迭代中,我們比較我們已經知道是相同的兩個數字。他們已經被間接比較。

假設你不被允許使用任何標準的圖書館設施(如果你是,爲什麼不是你?這對於std::set來說是微不足道的),我會以相反的順序工作。

  • 開始於unique=0
  • 看看第一個元素。增量計數。
  • 看看下一個元素。將它與以前的元素的所有進行比較。如果沒有匹配,則增加計數。
  • 重複。

(請注意,這是不是最好的算法,並沒有什麼,我會爲大投入做的,但它是非常簡單的解釋和使用的最基本C++概念實現。)

1

算法:

  1. 找到的最小和最大年齡(我們姑且稱之爲MIN_AGE和MAX_AGE)

  2. 分配與MAX_AGE-MIN_AGE陣列+ 1項(姑且稱之爲age_arr)

  3. 將所有條目age_arr 0

  4. 對於每個結構x,在條目#x中設置1。emp_age-MIN_AGE

  5. 總和的所有值(0或1)在age_arr,刪除age_arr並返回結果

實現:

//Phase 1 
int min_age = 1000; // Assumption!!! 
int max_age = 0; // Assumption!!! 
for(int i=0; i<n; i++) 
{ 
    if (min_age > t[i].emp_age) 
     min_age = t[i].emp_age; 
    if (max_age < t[i].emp_age) 
     max_age = t[i].emp_age; 
} 

//Phase 2 
int age_arr_size = max_age-min_age+1; 
int age_arr[] = new int[age_arr_size]; 

//Phase 3 
for(int age=0; age<age_arr_size; age++) 
    age_arr[age] = 0; 

//Phase 4 
for(int i=0; i<n; i++) 
    age_arr[t[i].emp_age-min_age] = 1; 

//Phase 5 
int age_count = 0; 
for(int age=0; age<age_arr_size; age++) 
    age_count += age_arr[age]; 
delete[] age_arr; 
return age_count; 
0

的問題是,你的代碼會低估獨特年齡段的人數:

eg說年齡是{1,2,3,4,1,5,6,1,7}

顯然有7名獨特的年齡在這裏,和n = 9

在代碼中,只有當i = 0(當uniq_num減少2)和i = 4(當uniq_num減少1)時,時間uniq_num將減少。

後一種情況是重複計算,所以你的算法給出了6而不是7.