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

C++のリンクリスト内の最小頻度要素をカウントします


与えられたタスクは、重複する要素を持つ特定のリンクリスト内の最小頻度要素をカウントすることです。

リンクリストは、各要素が次の要素にリンクされているリストのように、データがシリアル順に格納されるデータ構造です。

リンクリスト内の要素の頻度は、リンクリスト内で要素が発生している回数を指します。問題に応じて、リンクリストの最小頻度をカウントする必要があります。

リンクリスト1、1、3、1、3、4、6があるとします。ここで、最小頻度は1であるため、最小頻度を持つ要素をカウントする必要があります。頻度が最も低い要素4と6は2つしかないため、カウントは2です。

入力

linked list 1->1->2->2->2->3->3

出力

count is 2

説明

上記の例の最小頻度は2であり、最小頻度を持つ2つの要素(1と3)があるため、カウントは2です。

入力

linked list = 1->2->3->2->4->2->5

出力

count is 4

説明

上記の例の最小頻度は1で、最小頻度が1、3、4、5の4つの要素があるため、カウントは4です。

以下のプログラムで使用されるアプローチは次のとおりです

  • リンクリストを定義し、リンクリストの要素をプッシュします。

  • 最小頻度の要素の数を見つけるための最小関数で、数値の頻度を格納するマップ「mymap」を宣言します。

  • リストをトラバースし、要素の頻度(発生)をmymapに保存します。

  • 周波数を見つけてmymapに保存したら、最小周波数を見つけます。

  • マイマップで発生した頻度を数えます。

  • カウントを返します。

#include <iostream>
#include <unordered_map>
#include <climits>
using namespace std;
struct Node {
   int key;
   struct Node* next;
};
// to push the values in the stack
void push(struct Node** head_ref, int new_key){
   struct Node* new_node = new Node;
   new_node->key = new_key;
   new_node->next = (*head_ref);
   (*head_ref) = new_node;
}
// Function to count minimum frequency elements
// in the linked list
int minimum(struct Node* head){
   // Store frequencies of all nodes.
   unordered_map<int, int> mymap;
   struct Node* current = head;
   while (current != NULL){
      int value = current->key;
      mymap[value]++;
      current = current->next;
   }
   // Find min frequency
   current = head;
   int min = INT_MAX, count = 0;
   for (auto it = mymap.begin(); it != mymap.end(); it++){
      if (it->second <= min){
         min = it->second;
      }
   }
   // Find count of min frequency elements
   for (auto it = mymap.begin(); it != mymap.end(); it++){
      if (it->second == min){
         count += (it->second);
      }
   }
   return count;
}
int main(){
   /* Starting with an empty list */
   struct Node* head = NULL;
   int x = 21;
   push(&head, 30);
   push(&head, 50);
   push(&head, 61);
   push(&head, 40);
   push(&head, 30);
   cout <<"count is: "<<minimum(head) << endl;
   return 0;
}

出力

上記のコードを実行すると、次の出力が得られます-

count is: 3

  1. C++でソートおよびローテーションされたリンクリストのローテーションをカウントします

    リンクリストが表示されます。リストは最初にソートされ、次にK個のノードでローテーションされます。目標は、Kの値を見つけることです。K個のノードだけ回転する入力としてリンクリストを以下に示す場合- それならオリジナルは-だったに違いない ここでKは2であることがわかります。入力リンクリストは、元のソートされたリンクリストの2ノードのローテーションです。 例を挙げて理解しましょう。 入力 −リスト:5→7→9→1→3 出力 リンクリストの要素は次のとおりです。5791 3 ソートおよびローテーションされたリンクリストのローテーション数は-3 説明 −元のソート済み

  2. C++の循環リンクリストでノードをカウントします

    ノードを含む循環リンクリストが与えられ、タスクは循環リンクリストに存在するノードの数を計算することです。 循環リンクリストは、最初の要素が最後の要素を指し、最後の要素が最初の要素を指すリンクリストのバリエーションです。単一リンクリストと二重リンクリストの両方を循環リンクリストにすることができます。 以下のプログラムでは、単一リンクリストを循環リンクリストとして実装し、その中のノード数を計算しています。 例 Input − nodes-: 20, 1, 2, 3, 4, 5 Output − count of nodes are-: 6 Input &minus