Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में क्रमपरिवर्तन अनुक्रम

मान लीजिए कि सेट [1,2,3,...,n] जैसा है, जिसमें कुल n है! अद्वितीय क्रमपरिवर्तन। क्रम में सभी क्रमपरिवर्तनों को सूचीबद्ध और लेबल करके, हमें n =3 के लिए ये क्रम मिलते हैं:["123", "132", "213", "231", "312", "321"] तो यदि n और k दिए गए हैं, फिर kth क्रमपरिवर्तन अनुक्रम लौटाएं। n 1 से 9 (समावेशी) के बीच होगा और k 1 से n के बीच होगा! (सहित)। उदाहरण के लिए यदि n =3.

आइए चरणों को देखें -

  • Ans :=खाली स्ट्रिंग, आकार n के उम्मीदवार कहे जाने वाले सरणी को परिभाषित करें
  • मैं के लिए 0 से n - 1 की सीमा में
    • उम्मीदवार[i] :=((i + 1) + वर्ण '0')
  • फ़ैक्ट ऑफ़ साइज़ n + 1 नामक एक ऐरे बनाएं, फ़ैक्ट सेट करें[0] :=1
  • मैं के लिए 1 से n की सीमा में
    • तथ्य[i] :=तथ्य[i - 1] * i
  • k को 1 से घटाएं
  • i के लिए :=n - 1 से 0 तक
    • idx :=k / fact[i]
    • उत्तर:=उत्तर + उम्मीदवार[idx]
    • j के लिए:=idx, j + 1 <उम्मीदवारों का आकार
      • उम्मीदवार[j]:=उम्मीदवार[j + 1]
    • k:=k आधुनिक तथ्य[i]
  • वापसी उत्तर

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   string getPermutation(int n, int k) {
      string ans = "";
      vector <char> candidates(n);
      for(lli i = 0; i < n; i++)
         candidates[i] = ((i + 1) + '0');
      vector <lli> fact(n + 1);
      fact[0] = 1;
      for(lli i = 1; i <= n; i++)
         fact[i] = fact[i - 1] * i;
      k--;
      for(lli i = n - 1; i >= 0; i--){
         lli idx = k / fact[i];
         ans += candidates[idx];
         for(lli j = idx; j + 1< candidates.size(); j++)
            candidates[j] = candidates[j + 1];
         k = k % fact[i];
      }
      return ans;
   }
};
main(){
   Solution ob;
   cout << ob.getPermutation(4, 9);
}

इनपुट

4
9

आउटपुट

2314

  1. C++ में लेटर केस क्रमपरिवर्तन

    मान लीजिए कि हमारे पास अक्षरों और संख्याओं के साथ एक स्ट्रिंग है। हमें स्ट्रिंग में मौजूद अक्षरों के अपरकेस और लोअरकेस संस्करणों को लेकर उस स्ट्रिंग के सभी संभावित संयोजनों को उत्पन्न करना होगा। तो अगर एक स्ट्रिंग में केवल संख्याएं हैं, तो केवल वही वापस किया जाएगा। मान लीजिए कि स्ट्रिंग 1ab2 की तरह

  1. सी ++ में विभाज्य अनुक्रम

    विभाज्य अनुक्रम संख्याओं का एक विशेष क्रम है। अनुक्रम संख्या से ही शुरू होता है और अनुक्रम की अगली संख्या पिछले पदों के उचित भाजक का योग है। आइए अवधारणा को बेहतर ढंग से सीखने के लिए अनुक्रम का एक उदाहरण लेते हैं - Input : 8 Output : 8 7 1 0 Explanation :    Proper divisors of 8 are 4, 2,

  1. सी ++ में लेक्सिकोग्राफिक रूप से अगला क्रमपरिवर्तन

    यहां हम देखेंगे कि सी ++ में एक स्ट्रिंग के लेक्सिकोग्राफिक रूप से अगले क्रमपरिवर्तन को कैसे उत्पन्न किया जाए। लेक्सिकोग्राफिक रूप से अगला क्रमपरिवर्तन मूल रूप से अधिक से अधिक क्रमपरिवर्तन है। उदाहरण के लिए, ACB का अगला BAC होगा। कुछ मामलों में, लेक्सिकोग्राफ़िक रूप से अगला क्रमपरिवर्तन मौजूद नहीं ह