【问题标题】:Vector - value with k-occurences first向量 - 首先出现 k 次的值
【发布时间】:2020-06-24 23:18:35
【问题描述】:

这是我的第一篇文章,希望我没有做错任何事。 我正在尝试编写一个程序来找到在其中出现 k 次的向量的第一个值。

例如,给定此矢量和k = 3:

1 1 2 3 4 4 2 2 1 3

我会看到 2 作为输出,因为 2 是第一个到达第三次出现的数字。

以下代码是我尝试运行的,但不知何故输出不正确。


    #include<iostream>
    #include<vector>

    using namespace std;

    int main()
    {

        vector<int> vettore;
        int k;
        int a,b,i;
        int occ_a;
        int occ_b;

        cout<< "Write values of vector (number 0 ends the input of values)\n"; 
        int ins;
        cin>>ins;
        while(ins)
        {
            vettore.push_back(ins);     //Elements insertion
            cin>>ins;
        }
        cout<<"how many occurrences?\n"<<endl;;
        cin>>k;
        if(k>0)
        {
            int i=0;
            b = vettore[0];
            occ_b=0;

            while(i< vettore.size())
            {

                    int j=i;
                    occ_a = 0;
                    a = vettore[i];
                    while(occ_a < k && j<vettore.size())
                    {
                        if(vettore[j]== a)
                        {
                            occ_a++;
                            vettore.erase(vettore.begin() + j);
                        }
                        else
                            j++;
                    }
                    if(b!=a && occ_b < occ_a)
                        b = a;
                    i++;

            }
            cout << b;   //b is the value that reached k-occurrences first
        }
        return 0;
    }

时间已经过去,但我没有能够解决它。

感谢您的帮助!

【问题讨论】:

  • 这是一个很好的问题,可以用来练习使用开发环境附带的调试器。用最少的优化和任何可用的调试选项编译程序,然后在调试器中运行程序。使用调试器逐行执行程序,并密切关注正在使用的变量。一旦你看到程序做了你没想到的事情,停下来找出它发生的原因。通常意外是一个错误。 span>
  • 旁注:看看std::mapstd unordered_mapmap&lt;int, int&gt; 可以很短地解决频率计数类型的问题。
  • 旁注:在 C++ 中,我们在使用变量时声明变量,而不是在其作用域的顶部
  • 为什么会得到2 作为输出? 1 也出现 3 次,在数组中出现在 2 之前。
  • @0x499602D2 2 的第 k 次发生在 1 的第 k 次之前。:) 这就是我对分配的理解。

标签: c++ algorithm vector computer-science


【解决方案1】:

您的代码难以阅读,因为您在不使用变量的地方声明了变量。所以它们的含义很难理解。

也不需要从向量中删除元素。找到第一个出现 k 次的值并不等同于更改向量。它们是两个不同的任务。

我可以建议以下演示程序中显示的以下解决方案。

#include <iostream>
#include <vector>

int main() 
{
    std::vector<int> v = { 1, 1, 2, 3, 4, 4, 2, 2, 1, 3 };
    size_t least_last = v.size();
    size_t k = 3;

    for ( size_t i = 0; i + k <= least_last; i++ )
    {
        size_t count = 1;
        size_t j = i;

        while ( count < k && ++j < least_last )
        {
            if ( v[j] == v[i] ) ++count;
        }

        if ( count == k ) 
        {
            least_last = j;
        }           
    }

    if ( least_last != v.size() ) std::cout << v[least_last] << '\n';

    return 0;
}.

程序输出是

2

这个想法是找到第 k 次出现的第一个元素的最后位置。一旦找到遍历序列的上限,就将其设置为此值。因此,如果有另一个元素在此限制之前出现 k 次,则意味着它与已找到的元素相比是第一个出现的。

【讨论】:

  • 非常感谢您提出的解决方案!我没想过以这种方式解决问题,但比我的复杂!我试图以 O(n) 的复杂性来解决它,但我什至没有接近它...感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 2017-03-17
  • 2015-03-27
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多