Computer >> Máy Tính >  >> Lập trình >> C ++

Tiết lộ các thẻ theo thứ tự ngày càng tăng trong C ++

Giả sử chúng ta có một bộ bài; mỗi thẻ có một số duy nhất. Chúng tôi có thể đặt bộ bài theo bất kỳ thứ tự nào mà chúng tôi muốn. Vì vậy, Ban đầu, tất cả các lá bài bắt đầu úp xuống (chưa được tung lên) trong một bộ bài. Bây giờ, chúng tôi thực hiện các bước sau nhiều lần, cho đến khi tất cả các thẻ được tiết lộ -

  • Giả sử chúng ta có một bộ bài; mỗi thẻ có một số duy nhất. Chúng tôi có thể đặt bộ bài theo bất kỳ thứ tự nào mà chúng tôi muốn. Vì vậy, Ban đầu, tất cả các lá bài bắt đầu úp xuống (chưa được tung lên) trong một bộ bài. Bây giờ, chúng tôi thực hiện các bước sau nhiều lần, cho đến khi tất cả các thẻ được tiết lộ -

  • Nếu vẫn còn quân bài trong bộ bài, hãy đặt lá bài trên cùng tiếp theo của bộ bài ở cuối bộ bài.

  • Nếu vẫn còn thẻ chưa nhìn thấy, hãy quay lại bước 1. Nếu không, hãy dừng quá trình.

Vì vậy, chúng tôi phải trả lại một thứ tự của bộ bài sẽ tiết lộ các thẻ theo thứ tự tăng dần.

Bây giờ mục đầu tiên trong câu trả lời được coi là đầu của bộ bài.

Vì vậy, nếu đầu vào là [17,13,11,2,3,5,7], thì đầu ra sẽ là [2,13,3,11,5,17,7], Giả sử chúng ta đã sắp xếp lại thứ tự đó thành [2,13,3,11,5,17,7], lúc này 2 là trên cùng, sau khi nhìn thấy 2, chuyển 13 xuống cuối cùng, như vậy bộ bài sẽ giống như [3,11,5,17,7,13 ], sau đó xóa 3 và thực hiện lại bước. Vì vậy, bộ bài sẽ là [5,17,7,13,11], sau đó loại bỏ 5, sau đó sau khi chuyển từ trên xuống dưới, mảng sẽ là [7,13,11,17], sau đó làm tương tự, bộ bài cấu trúc sẽ là [11,17,13], [13.17], [17], sau đó xóa 17.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Lúc đầu, sắp xếp bộ bài, đặt n:=kích thước của bộ bài

  • xác định một hàng đợi q và một mảng được gọi là ans có kích thước n

  • chèn các phần tử i liên tiếp vào q, trong đó i nằm trong khoảng từ 0 đến n - 1

  • cho tôi trong phạm vi từ 0 đến n - 1

    • x:=phần tử phía trước của q, sau đó xóa khỏi hàng đợi

    • ans [x]:=boong [i]

    • x:=phần tử phía trước của q và xóa khỏi hàng đợi

    • chèn x vào q

  • trả lại ans

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

Ví dụ

#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:
   vector<int> deckRevealedIncreasing(vector& deck) {
      sort(deck.begin(), deck.end());
      int n = deck.size();
      queue <int> q;
      vector <int> ans(n);
      for(int i = 0; i < n; i++)q.push(i);
      int x;
      for(int i = 0; i < n; i++){
         x = q.front();
         q.pop();
         ans[x] = deck[i];
         x = q.front();
         q.pop();
         q.push(x);
      }
      return ans;
   }
};
main(){
   vector<int> v1 = {17,13,11,2,3,5,7};
   Solution ob;
   print_vector(ob.deckRevealedIncreasing(v1));
}

Đầu vào

[17,13,11,2,3,5,7]

Đầu ra

[2,13,3,11,5,17,7]