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

C++のジグザグイテレータ


2つの1D配列があるとすると、それらの要素を交互に返すイテレータを実装する必要があります。 2つの方法があります-

  • next()-次の要素を取得する

  • hasNext()-次の要素が存在するかどうかを確認します。

したがって、入力がv1 =[1,2] v2 =[3,4,5,6]の場合、出力は[1,3,2,4,5,6]、

になります。

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

  • ペアの1つのキューqを定義します

  • イニシャライザから、2つのアレイv1とv2を作成します。

  • サイズがv1の場合、-

    • {0、0}をq

      に挿入します
  • サイズがv2の場合、-

    • {0、1}をq

      に挿入します
  • 1ペアの温度を定義する

  • temp:=qの最初の要素

  • qから要素を削除

  • ret:=0

  • temp.secondが1と同じ場合、-

    • ret:=v2 [temp.first]

    • (最初に温度を1上げます)

    • temp.first

      • qにtempを挿入

  • それ以外の場合

    • ret:=v1 [temp.first]

    • (最初に温度を1上げます)

    • temp.first

      • qにtempを挿入

  • retを返す

  • 関数hasNext()

    を定義します
  • qが空でない場合はtrueを返します

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

#include <bits/stdc++.h>
using namespace std;
class ZigzagIterator {
public:
   queue <pair<int, int>> q;
   vector <int< v1, v2;
   ZigzagIterator(vector<int<& v1, vector<int<& v2) {
      this->v1 = v1;
      this->v2 = v2;
      if (v1.size()) {
         q.push({ 0, 0 });
      }
      if (v2.size()) {
         q.push({ 0, 1 });
      }
   }
   int next() {
      pair<int, int> temp;
      temp = q.front();
      q.pop();
      int ret = 0;
      if (temp.second == 1) {
         ret = v2[temp.first];
         temp.first++;
         if (temp.first < v2.size())
            q.push(temp);
      }
      else {
         ret = v1[temp.first];
         temp.first++;
         if (temp.first < v1.size())
            q.push(temp);
      }
      return ret;
   }
   bool hasNext() {
      return !q.empty();
   }
};
main(){
   vector<int< v1 = {1,3,5,7}, v2 = {2,4,6,8,10,12,17};
   ZigzagIterator ob(v1, v2);
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.hasNext() ? "True" : "False") << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.hasNext() ? "True" : "False") << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.hasNext() ? "True" : "False") << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.hasNext() ? "True" : "False") << endl;
}

入力

{1,3,5,7},{2,4,6,8,10,12,17}

出力

1
2
True
3
4
5
True
6
7
8
10
True
12
17
False

  1. C ++でのMatrixのジグザグ(または対角)トラバーサル

    この問題では、2D行列が与えられます。私たちの仕事は、マトリックのすべての要素を対角線の順序で印刷することです。 問題を理解するために例を見てみましょう 1    2    3 4    5    6 7    8    9 出力- 1 4    2 7    5    3 8    6 9 マトリックスをジグザグ形式または対角形式で印刷するときに従うパターンを見てみましょう。 こ

  2. C++でのZigZagツリートラバーサル

    この問題では、二分木が与えられます。私たちの仕事は、二分木をジグザグ形式で印刷することです。 問題を理解するために例を見てみましょう 上記の二分木のジグザグ走査は 3    5    1    8    7    0    4 この問題を解決するには、二分木をレベルごとにトラバースする必要があります。トラバーサルの順序は、各レベルの後で反転します。 ここで、2つのスタック(現在と次)と1つの値を注文に使用します。まず、ノードを現在のノードからトラバースし、ノード