查找数组中两个给定数字的出现次数

时间:2018-09-01 04:20:51

标签: c++ algorithm

这是我的示例代码:

#include<iostream>
using namespace std;
int main()
{ 
    int c[] = {10, 12, 14, 32, 2, 33 ,3}, num1, num2;
    int count = 0; 
    cout << "Enter 2 numbers : " ;
    cin  >> num1 >> num2;       
 }

如何完成代码?

Sample output

4 个答案:

答案 0 :(得分:1)

您可以使用搜索算法来解决此问题。

有两种流行的搜索算法:

  • 线性搜索
  • 二分搜索

我使用了线性搜索。解决方法如下:

    #include<iostream>
    using namespace std;
    int main()
    {
        int c[] = {10, 12, 14, 32, 2, 33 ,3}, num1, num2;
        int count = 0; 
        int arr[] = {num1,num2};
        cout << "Enter 2 numbers : " ;
        cin  >> num1 >> num2;
        arr[0]=num1;
        arr[1]=num2;
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<7;j++)
            {
                if(arr[i]==c[j])
                {
                    count++;
                    break;
                }
            }
        }
        cout<<"The numbers has "<<count<<" matches with this array";
     }

在这里,我创建了要检查的两个数字的数组,然后在给定的数组c中搜索它。

答案 1 :(得分:1)

首先输入代码:

#include<iostream>
#include <iterator>
#include <algorithm>
using namespace std;
int main()
{ 
    int c[] = {10, 12, 14, 32, 2, 33 ,3}, num1, num2;
    int count = 0; 
    cout << "Enter 2 numbers : " ;
    cin  >> num1 >> num2;
    auto q1 = std::count(std::begin(c), std::end(c), num1);
    auto q2 = std::count(std::begin(c), std::end(c), num2);
    cout << num1 << ": " << q1 << "\n" << num2 << ": " << " " << q2;
}

说明:

算法库包含您可能要使用的常见算法。其中一些将迭代器用于容器(开始迭代器和结束迭代器,如果您不熟悉它们,现在可以将它们视为指针)。 count是一种计算集合中某项的出现次数的算法。 要从c数组中获取迭代器,可以使用std :: begin和std :: end。其他替代方法包括使用向量或std :: array代替c数组。示例:

#include<iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <array>
using namespace std;
int main()
{ 
    int c[] = {10, 12, 14, 32, 2, 33 ,3}, num1, num2;
    vector<int> vec;
    vec.assign(c, c + (sizeof(c)/sizeof(int)));
    std::array<int, 7> cpp;
    std::copy(std::begin(c), std::end(c), std::begin(cpp));
    int count = 0; 
    cout << "Enter 2 numbers : " ;
    cin  >> num1 >> num2;
    //auto q1 = std::count(std::begin(c), std::end(c), num1);
    //auto q2 = std::count(std::begin(c), std::end(c), num2);
    //auto q1 = std::count(std::begin(vec), std::end(vec), num1);
    //auto q2 = std::count(std::begin(vec), std::end(vec), num2);
    auto q1 = std::count(std::begin(cpp), std::end(cpp), num1);
    auto q2 = std::count(std::begin(cpp), std::end(cpp), num2);
    cout << num1 << ": " << q1 << "\n" << num2 << ": " << " " << q2;
}

答案 2 :(得分:0)

#include< iostream>

using std::cout;
using std::cin;
using std::endl;

int main()
{
    int num1, num2;
    int Array = [] = { 1,33,43,75,96,44,55 };
    int size = sizeof(Array) / sizeof(int), i;
    cout << "Enter two numbers:\n";
    cin >> num1 >> num2;

    for (i = 0; i < size; i++)
    {
        if (Arrar[i] % num1 == 0)  cout << endl << num1 << " is matched";

        if (Arrar[i] % num2 == 0)  cout << endl << num2 << " is matched";
    }

    return 0;
}

答案 3 :(得分:0)

选择容器

代替使用{em> C型数组作为{em>容器的int s的容器

int c[] = {10, 12, 14, 32, 2, 33, 3};

我建议您使用std::array

std::array<int, 7> c{10, 12, 14, 32, 2, 33, 3};

std::vector

std::vector<int> c{10, 12, 14, 32, 2, 33, 3};

线性搜索

不需要对集合进行排序,查找集合中某个元素的出现所花费的时间复杂度为O(n)。功能模板std::count可用于此目的:

#include <iostream>
#include <vector>
#include <algorithm> // std::count

int main() {
    std::vector<int> c{10, 12, 14, 32, 2, 33, 3};

    int num1, num2;
    std::cin >> num1 >> num2;

    // apply linear search
    auto count = std::count(c.begin(), c.end(), num1);
    count     += std::count(c.begin(), c.end(), num2);

    std::cout << count << std::endl;
}

二进制搜索

可以通过O(log n)的运行时间复杂度来找到集合中某个元素的出现。但是,您对进行二进制搜索的集合必须进行排序(不是这样)。可以使用std::sort在O(n log n)中进行排序。 std::equal_range可用于通过对元素进行二进制搜索来获得该元素在已排序集合中所有出现的范围:

#include <iostream>
#include <vector>
#include <iterator>  // std::distance
#include <algorithm> // std::sort, std::equal_range

int main() {
    std::vector<int> c{10, 12, 14, 32, 2, 33, 3};

    int num1, num2;
    std::cin >> num1 >> num2;

    // sort collection
    std::sort(c.begin(), c.end());

    // apply binary search
    auto itp = std::equal_range(c.begin(), c.end(), num1);
    auto count = std::distance(itp.first, itp.second);

    itp = std::equal_range(c.begin(), c.end(), num2);
    count += std::distance(itp.first, itp.second);

    std::cout << count << std::endl;
}

使用哪种方法取决于要对集合执行的搜索次数。

  • 线性搜索需要O(n)。
  • 二元搜索采用O(log n),但必须对集合进行排序,并且采用O(n log n)。

如果您要执行 N 个搜索,并且 N n 大得多(即集合中的元素数量) ,那么最好使用二进制搜索,否则使用线性搜索。

对于您的特定情况: n = 7和 N =2。因此,最好坚持使用线性搜索方法。