计算数组的不同元素

时间:2014-01-06 16:08:21

标签: c++

我是一名IT学员,我们将参加编程考试,测试程序将测试我们的课程。其中一个粒子示例是我们得到了人们的年龄和薪水,我们必须计算人们有多少不同年龄

我的代码看起来像这样  结构:

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次,有些人表示输出很好,但是对于某些测试,它说错了输出。我不知道测试引擎是如何工作的,我也不知道问题是什么。

4 个答案:

答案 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来说是微不足道的!),我会以相反的顺序工作。< / p>

  • unique=0开始。
  • 看看第一个元素。增量计数。
  • 看下一个元素。将其与所有之前的元素进行比较。如果没有匹配,则增加计数。
  • 重复。

(请注意,这不是最好的算法,并不是我对大输入做的事情,但使用最基本的C++概念解释和实现起来非常简单。)

答案 1 :(得分: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();
}

答案 2 :(得分:1)

<强>算法:

  1. 查找最低和最高年龄(让我们称之为min_age和max_age)

  2. 使用max_age-min_age + 1个条目分配一个数组(让我们称之为age_arr)

  3. 将age_arr中的所有条目设置为0

  4. 对于每个结构x,在条目#x.emp_age-min_age

  5. 中设置1
  6. 汇总age_arr中的所有值(0或1),删除age_arr并返回结果

  7. <强>实施

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

答案 3 :(得分:0)

问题是你的代码会低估独特年龄的数量:

e.g。说年龄是{1,2,3,4,1,5,6,1,7}

显然,这里有7个独特的年龄,n = 9。

在你的代码中,uniq_num减少的唯一时间是当i = 0时(当uniq_num减少2时)和i = 4(当uniq_num减少1时)。

后一种情况是重复计算,因此您的算法给出的答案是6而不是7。