2014-01-06 186 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.