【问题标题】:Efficient way of sorting array of numbers, then count the number of times the value increased排序数字数组的有效方法,然后计算值增加的次数
【发布时间】:2023-03-27 03:39:01
【问题描述】:

例如,我想排序如下:

1 1 1 4 4 4 4 4 3 3 2 2 2

进入:

1 2 3 4 1 2 3 4 1 2 4 4 4

然后打印出来:

8

我的错误代码:

#include<bits/stdc++.h>

using namespace std;

int main()
{
    vector <long long unsigned> a,b,c;
    long long unsigned n,k,count=0,j=1;
    cin>>n;
    for(long long unsigned i=0;i<n;i++)
    {
        cin>>k;
        a.push_back(k);
    }
    for(long long unsigned i=0;i<a.size();i++)
    {
        b.push_back(a[i]);
        if(a[i]==a[i+1])
        {
            count=count+b.size()-1;
            b.clear();
        }
        if(i==a.size()-1)
            count=count+b.size()-1;
    }
    cout<<count;
    return 0;
}

排序是可选的,我主要需要一个好的计数过程。

谢谢。

【问题讨论】:

  • 那里有错字吗?你的意思是第二个序列是 1 2 3 1... 吗?因为它是我不知道第一个,第二个和第三个序列/数字之间的关系。
  • 你的家庭作业什么时候交?
  • 你必须努力解决问题。堆栈溢出不是让别人为你写代码的地方。
  • @InternetAussie 你忘了指出使用裸整数类型(unsigned long long 等)也是不好的做法。 uint64_t 是更好的选择...(来自#include &lt;cstdint&gt;

标签: c++ sorting count counter


【解决方案1】:

我不确定以您想要的方式对向量或数组进行排序的“有效”方式(即 1,2,3,4,1,2,3,4,1,2 ,4,4)。但是对于一个详尽的方式,你可以......

遍历未排序的向量(UV)并找到高于前一次运行最小值的最小值(第一轮初始化为零,每次没有高于搜索值的值)。当找到最小值时,记录其索引并在遍历向量后删除存储索引处的值并将该值添加到排序向量 (SV)。继续遍历 UV,直到它为空,并且每个项目都已添加到 SV。现在遍历 SV,每次前一个值小于当前值时加 1。

  1. 初始化 prev-min 值。和 current-min,每次更新时也会存储其索引。
  2. 循环遍历 UV(未排序的向量)。
  3. 如果某个值高于 prev-min 但低于 current-min,则设置为新的 current-min,并更新当前 min 索引。
  4. 在向量循环结束时,您将获得当前最小值及其索引值。
  5. 如果 prev-min 与 current-min 相同,则将 prev-min 设置回零并再次循环(步骤 2)。
  6. 将当前最小值添加到 SV 并从 UV 中删除当前最小值。
  7. 将 prev-min 设置为 current-min 并重复循环(步骤 2)。
  8. 一旦 UV 为空,迭代 SV。
  9. 每次当前值高于前一个值时加一。

这应该产生每个连续值都高于前一个值的排序向量,除非它是最高值,在这种情况下使用下一个最小值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多