我是一名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次,有些人表示输出很好,但是对于某些测试,它说错了输出。我不知道测试引擎是如何工作的,我也不知道问题是什么。
答案 0 :(得分:3)
考虑一下:10 10 10
。
将i
和j
视为指向元素:
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)
<强>算法:强>
查找最低和最高年龄(让我们称之为min_age和max_age)
使用max_age-min_age + 1个条目分配一个数组(让我们称之为age_arr)
将age_arr中的所有条目设置为0
对于每个结构x,在条目#x.emp_age-min_age
汇总age_arr中的所有值(0或1),删除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;
答案 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。