计算非重复出现

时间:2019-12-26 15:51:25

标签: c++ arrays

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中的非重复出现。

1 个答案:

答案 0 :(得分:1)

我起草了许多可能的解决方案之一。我使用的是C ++,而不是C,因此,没有普通的C-Style数组。但是,使用的算法当然也适用于C样式数组。

请注意:您输入的数据有误。您创建了一个包含16个值的数组,但是初始化列表的长度为20个值。

我正在使用std::vector作为解决方案。

首先,我们从头到尾遍历num3。我们将初始的“开始”索引设置为0。然后,将ith元素与ith + 1元素进行比较。只要它们相等,我们就增加i-index。如果下一个没有找到相等的值,则我具有新的不同值的索引。

要计算num2中的不同值,我们使用特殊属性std::setstd::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;
}