C++程序:查找正在通话的人员对数


假设我们有一个包含n个元素的数组A。A[i]确定第i个ID。A[i]是SKP呼叫会话的数量。如果A[i]为0,则表示该人员未使用SKP呼叫系统。我们必须分析这些数据并找出正在通话的呼叫人员对数。如果无法做到,则返回-1。

问题类别

这个问题属于排序问题。在讨论计算机科学中不同的问题解决算法时,排序是一个非常常见的问题。顾名思义,排序表示将一组数据排列成某种方式。一般来说,我们可以将它们排列成非递减顺序或非递增顺序。否则,排序也可以以预定义的方式进行。对于基于字符串的问题,有时我们使用字典排序来按字典顺序排列字母。有很多不同的排序技术,具有一定的变化及其时间和空间复杂度。迄今为止,基于比较的排序技术的最低时间复杂度为O(n*log n)。但是,也有一些机械排序技术,例如桶排序、基数排序、计数排序,它们的时间复杂度是线性的O(n)。要了解更多信息,请点击以下链接:

https://tutorialspoint.com/data_structures_algorithms/sorting_algorithms.htm

因此,如果我们问题的输入类似于A = [0, 1, 7, 1, 7, 10],则输出将为2,因为呼叫人员之间有两个SKP呼叫:人员2和人员4,人员3和人员5。

步骤

为了解决这个问题,我们将遵循以下步骤:

t := 0
ans := 0
n := size of A
sort the array A
for initialize i := 0, when i < n - 1, update (increase i by 1), do:
   if A[i] is same as A[i + 1] and A[i] is not equal to 0, then:
      (increase t by 1)
      (increase ans by 1)
      if t >= 2, then:
         return -1
   Otherwise
      t := 0
return ans

示例

让我们看看下面的实现,以便更好地理解:

#include <bits/stdc++.h>
using namespace std;
int solve(vector<int> A){
   int t = 0;
   int ans = 0;
   int n = A.size();
   sort(A.begin(), A.end());
   for (int i = 0; i < n - 1; i++){
      if (A[i] == A[i + 1] && A[i] != 0){
         t++;
         ans++;
         if (t >= 2){
            return -1;
         }
      }
      else
         t = 0;
   }
   return ans;
}
int main(){
   vector<int> A = { 0, 1, 7, 1, 7, 10 };
   cout << solve(A) << endl;
}

输入

{ 0, 1, 7, 1, 7, 10 }

输出

2

更新于:2022年4月7日

浏览量:149

启动您的职业生涯

完成课程后获得认证

开始
广告