Dados K vectores, la tarea es diseñar un iterador cíclico que imprima los elementos de estos vectores de manera cíclica. Por ejemplo: v1 = {1, 2, 3}, v2 = {4, 5, 6} y v3 = {7, 8, 9} entonces la salida debería ser 1, 4, 7, 2, 5, 8, 3 , 6 y 9 .
Ejemplos:
Entrada: v1 = {1, 2}, v2 = {3, 4, 5}, v3 = {6}
Salida: 1 3 6 2 4 5Entrada: v1 = {1, 2}, v2 = {3, 4}
Salida: 1 3 2 4
Enfoque: cree dos arrays, una almacenará los iteradores iniciales de cada vector y la otra almacenará los iteradores finales de cada vector. Luego imprima el contenido de los vectores de manera cíclica. Dado que los vectores pueden tener longitudes variables, omita los vectores cuyos elementos ya se han impreso.
A continuación se muestra la implementación del enfoque anterior:
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Class for the cyclic iterator class Iterator { public: Iterator(vector<int>& a1, vector<int>& a2, vector<int>& a3, vector<int>& a4, int k); int numOfVectors; int currIndex; // Vectors to store the starting and the // ending iterators for each of the vector vector<vector<int>::iterator> iStart; vector<vector<int>::iterator> iEnd; // Function that returns true if // there are elements left to print bool hasNext(); // Function that returns the next // element in a cyclic manner int next(); }; // Function that returns true if // there are elements left to print bool Iterator::hasNext() { // If iterator of any vector has not // reached the end then return true for (int i = 0; i < numOfVectors; i++) { if (iStart[i] != iEnd[i]) return true; } return false; } // Function that returns the next // element in a cyclic manner int Iterator::next() { int elem = 0; if (iStart[currIndex] != iEnd[currIndex]) { elem = *iStart[currIndex]++; currIndex = (currIndex + 1) % numOfVectors; return elem; } else { currIndex = (currIndex + 1) % numOfVectors; return next(); } return elem; } // Initialise object of the Iterator class Iterator::Iterator(vector<int>& a1, vector<int>& a2, vector<int>& a3, vector<int>& a4, int k) { numOfVectors = k; iStart.resize(numOfVectors); iEnd.resize(numOfVectors); // Store begin iterators iStart[0] = a1.begin(); iStart[1] = a2.begin(); iStart[2] = a3.begin(); iStart[3] = a4.begin(); // Store ending iterators iEnd[0] = a1.end(); iEnd[1] = a2.end(); iEnd[2] = a3.end(); iEnd[3] = a4.end(); // CurrIndex denotes the vector's index // whose element is to be printed next currIndex = 0; } // Function to print the elements in a cyclic manner void iterateCyclic(vector<int>& a1, vector<int>& a2, vector<int>& a3, vector<int>& a4, int k) { // Initialise the iterator Iterator it(a1, a2, a3, a4, k); // Print all the element // in a cyclic fashion while (it.hasNext()) { cout << it.next() << " "; } } // Driver code int main() { // Initialize the vectors vector<int> a1; a1.push_back(1); a1.push_back(2); a1.push_back(3); vector<int> a2; a2.push_back(4); a2.push_back(5); a2.push_back(6); a2.push_back(7); vector<int> a3; a3.push_back(8); a3.push_back(9); vector<int> a4; a4.push_back(10); a4.push_back(11); // Print the elements in a cyclic fashion iterateCyclic(a1, a2, a3, a4, 4); return 0; }
1 4 8 10 2 5 9 11 3 6 7
Publicación traducida automáticamente
Artículo escrito por Aashish Chauhan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA