C ++时代的朋友

假设有人会提出朋友请求。我们知道他们的年龄,这些年龄存储在年龄[i]中。因此,这表明第i个人的年龄。现在,如果满足以下任一条件,则A不会成为好友请求人B(B!= A)-

  • 年龄[B] <= 0.5 *年龄[A] + 7

  • 年龄[B]>年龄[A]

  • 年龄[B]> 100 &&年龄[A] <100

否则,A将朋友请求B。您可以认为,如果A请求B,则B不一定请求A。而且,人们也不会朋友请求自己。因此,我们必须查找总共发出了多少个好友请求?

假设age数组类似于[16,17,18],则结果将为2,因为请求将为17-> 16,18-> 17。

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

  • 定义大小为1000的数组存储桶,然后将年龄数组元素的频率存储在存储桶中。

  • 然后找到并存储存储桶元素的累计和

  • ret:= 0

  • 对于0到年龄数组大小的范围中的i – 1

    • ret:= bucket [x] – bucket [y]

    • 如果bucket [x] – bucket [y]不为零,则将ret减小1

    • x:= ages [i],y:=(ages [i] / 2)+ 7

    • 如果x> = y,则

    • 返回ret。

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int numFriendRequests(vector<int>& ages) {
          vector <int> bucket(1000);
          for(int i = 0; i < ages.size(); i++){
             bucket[ages[i]]++;
          }
          for(int i = 1; i < 1000; i++)bucket[i] += bucket[i - 1];
          int ret = 0;
          for(int i = 0; i < ages.size(); i++){
             int x = ages[i];
             int y = ((ages[i]) / 2) + 7;
             if(x >= y){
                ret += (bucket[x] - bucket[y]);
                if((bucket[x] - bucket[y]))
                ret--;
             }
          }
          return ret;
       }
    };
    main(){
       vector<int> v1 = {16, 17, 18};
       Solution ob;
       cout << (ob.numFriendRequests(v1));
    }

    输入值

    [16,17,18]

    输出结果

    2