C++程式:查詢正在通話的人員對數


假設我們有一個包含n個元素的陣列A。A[i]確定第i個ID。A[i]是SKP呼叫會話的數量。如果A[i]為0,則表示該人員未使用SKP呼叫系統。我們必須分析這些資料並找出正在通話的呼叫人員對數。如果無法做到,則返回-1。

問題類別

這個問題屬於排序問題。在討論計算機科學中不同的問題解決演算法時,排序是一個非常常見的問題。顧名思義,排序表示將一組資料排列成某種方式。一般來說,我們可以將它們排列成非遞減順序或非遞增順序。否則,排序也可以以預定義的方式進行。對於基於字串的問題,有時我們使用字典排序來按字典順序排列字母。有很多不同的排序技術,具有一定的變化及其時間和空間複雜度。迄今為止,基於比較的排序技術的最低時間複雜度為O(n*log n)。但是,也有一些機械排序技術,例如桶排序、基數排序、計數排序,它們的時間複雜度是線性的O(n)。要了解更多資訊,請點選以下連結:

https://tutorialspoint.tw/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

啟動您的職業生涯

完成課程後獲得認證

開始
廣告
© . All rights reserved.