int num2[ ]={100,101,101,102,103,104,104,105,106,106,106,107,107,108,108,108,108,109,109,110};
int num3[ ]={1010,1010,1010,1010,1010,1010,1010,1010,1015,1015,1015,1015,1015,107,107,107,107,107,107,107};
从以上两个数组中,我要做的是计算数组num2
中出现不同数字的次数。不同出现的次数将基于数组num3
。
例如:在num3[16]
中,第一个元素[0]为1010
,直到数组num1
的第8个位置,元素1010
相同。因此,我们必须为元素num2
计算1010
中不同数字的出现。
因此,对于1010
中的num3
元素,我们在num2
中出现的数字是6。在num2
中出现的这些数字是100,101,102,103,104,105
。
对于num3
中的下一个条目,它的编号必须不同于第一个(1010)。因此,num2
1015中相应数组元素在num3
中的总不同项为2,它们在106,107
数组中为= num2
如果我要对相同的出现次数进行计数,我可以很容易地做到这一点:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int num2[]={100,101,101,102,103,104,104,105,106,106,106,107,107,108,108,108,108,109,109,110};
int n = sizeof(num2) / sizeof(num2[0]);
cout << "Number of times 101 appears : "
<< count(num2, num2 + n, 101);
return 0;
}
但是问题不同,因为我必须遵循数组num3
并为num2
中的非重复元素计算num3
中的非重复出现。
答案 0 :(得分:1)
我起草了许多可能的解决方案之一。我使用的是C ++,而不是C,因此,没有普通的C-Style数组。但是,使用的算法当然也适用于C样式数组。
请注意:您输入的数据有误。您创建了一个包含16个值的数组,但是初始化列表的长度为20个值。
我正在使用std::vector
作为解决方案。
首先,我们从头到尾遍历num3。我们将初始的“开始”索引设置为0。然后,将ith元素与ith + 1元素进行比较。只要它们相等,我们就增加i-index。如果下一个没有找到相等的值,则我具有新的不同值的索引。
要计算num2中的不同值,我们使用特殊属性std::set
。 std::set
只能包含唯一或不同的值。因此,我们尝试将num2中的所有值放入std::set
中。但是只会添加不同的值。 std::set
中已经存在的值将被丢弃。我们有“开始”和“ i”,并使用std::set
的范围构造函数来填充它。
要获得结果,我们只需要使用std::set
函数来计算size()
中的元素。
最后,我们设置一个新的起始值,然后继续。简单的解决方案,但是有效。
请参阅:
#include <algorithm>
#include <vector>
#include <set>
#include <iterator>
#include <iomanip>
std::vector<int> num2{ 100,101,101,102,103,104,104,105,106,106,106,107,107,108,108,108,108,109,109,110 };
std::vector<int> num3{ 1010,1010,1010,1010,1010,1010,1010,1010,1015,1015,1015,1015,1015,107,107,107,107,107,107,107 };
int main() {
// Check for sufficent sizes of the vector
if (num2.size() >= num3.size()) {
// Initial start value. We will search at the begin of num3
size_t start{ 0 };
while (start < num3.size()) {
// Set i = equal to current start value. So, search at the beginning of the next unequal number
size_t i{ start };
// Find the next non matching value
while (i < (num3.size() - 1) && (num3[i] == num3[i + 1])) ++i;
// Copy all values from num 2 in a std::set, which can only contain distinct values
std::set<int> values(std::next(num2.begin(), start), std::next(num2.begin(), i));
// Print result. Show number of distinct values
std::cout << "\n" << std::setw(2) << values.size() << " -> " << std::setw(5) << num3[i] << " --> ";
std::copy(values.begin(), values.end(), std::ostream_iterator<int>(std::cout, " "));
// Evaluate next identical values from num3
start = ++i;
}
}
else std::cerr << "\n***** Error: num2 too short\n";
return 0;
}