C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

お気に入りの会社のリストがC++の別のリストのサブセットではない人


好きな会社という配列があり、favoriteCompanies[i]がi番目の人の好きな会社のリストであるとします。お気に入りの会社のリストが他のお気に入りの会社のリストのサブセットではない人々のインデックスを見つける必要があります。

したがって、入力がfavoriteCompanies =[["TCS"、 "google"、 "facebook"]、["google"、 "microsoft"]、["google"、 "facebook"]、["google"]、 ["amazon"]]の場合、出力は[0,1,4]になります。これは、index=2の人がfavoriteCompanies[0]=["のサブセットである["google"、"facebook"]を持っているためです。 TCS "、" google "、"facebook"]インデックス0の人に対応します。

これで、index=3の人はfavoriteCompanies[0]=["TCS"、 "google"、"facebook"]とfavoriteCompanies[1] =["google"、"microsoft"]のサブセットである["google"]を持っています。お気に入りの会社の他のリストは別のリストのサブセットではないため、答えは[0,1,4]です。

これを解決するには、次の手順に従います-

  • 関数ok()を定義します。これは、配列a、配列b、

    を取ります。
  • cnt:=0、i:=0、j:=0

  • 一方(i

    • a[i]がb[j]と同じ場合、-

      • (i、j、cntを1増やします)

    • それ以外の場合、a [i]

      • (iを1増やします)

    • それ以外の場合

      • (jを1増やします)

  • cnt<サイズ

    の場合にtrueを返します
  • メインの方法から、次のようにします-

  • 1つのセットを定義する

  • n:=fのサイズ

  • 初期化i:=0の場合、i

    • 配列f[i]

      を並べ替えます
  • 初期化i:=0の場合、i

    • c:=true

    • 初期化j:=0の場合、j

      • iがjと同じ場合、-

        • 次の部分は無視して、次の反復にスキップしてください

      • c:=c AND ok(f [i]、f [j])

    • cがゼロ以外の場合、-

      • iをsに挿入します

  • sの要素を配列として返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   bool ok(vector<string>& a, vector<string>& b){
      int cnt = 0;
      int i = 0;
      int j = 0;
      while (i < a.size() && j < b.size()) {
         if (a[i] == b[j]) {
            i++;
            j++;
            cnt++;
         }
         else if (a[i] < b[j]) {
            i++;
         }
         else {
            j++;
         }
      }
      return cnt < a.size();
   }
   vector<int> peopleIndexes(vector<vector<string> >& f){
      set<int> s;
      int n = f.size();
      for (int i = 0; i < n; i++) {
         sort(f[i].begin(), f[i].end());
      }  
      for (int i = 0; i < n; i++) {
         bool c = true;
         for (int j = 0; j < n; j++) {
            if (i == j)
               continue;
            c &= ok(f[i], f[j]);
         }
         if (c)
            s.insert(i);
      }
      return vector<int>(s.begin(), s.end());
   }
};
main(){
   Solution ob;
   vector<vector<string>> v = {{"TCS","google","facebook"},{"google","microsoft"},{"google","facebo
ok"},{"google"},{"amazon"}};
print_vector(ob.peopleIndexes(v));
}

入力

{{"TCS","google","facebook"},{"google","microsoft"},{"google","facebook"},{"google"},{"amazon"}}

出力

[0, 1, 4, ]

  1. 円が別の円の内側にあるかどうか、C++ではないかどうかを確認します

    2つの円(中心点と半径の値)があるとすると、1つの円が別の円の内側に収まっているかどうかを確認する必要があります。考えられる原因は3つあります。 小さい方の円は、互いに接触することなく、大きい方の円の内側に完全にあります。この場合、中心間の距離と小さい方の半径の合計は、大きい方の半径よりも小さくなります。したがって、小さい方が大きい方の内側になります。 2番目のケースは、小さい円が大きい円の内側にあるが、大きい円の円周にも接している場合です。 3番目のケースは、小さい円の一部が大きい円の内側にあることです。 これを解決するには、2つの中心間の距離を見つけ、距離と半径の値

  2. C++でのストランドソート

    このセクションでは、C++の標準ライブラリを使用して配列またはリンクリストを並べ替える方法を説明します。 C ++には、さまざまな目的に使用できる複数の異なるライブラリがあります。並べ替えもその1つです。 C++関数std::list ::sort()は、リストの要素を昇順で並べ替えます。等しい要素の順序は保持されます。比較のために演算子<を使用します。 例 #include <iostream> #include <list> using namespace std; int main(void) {    list<int> l =