मान लीजिए कि एक स्ट्रिंग है। उस स्ट्रिंग को जादुई स्ट्रिंग S कहा जाता है, जिसमें केवल '1' और '2' होते हैं और निम्नलिखित नियमों का पालन करते हैं -
- स्ट्रिंग S जादुई है क्योंकि '1' और '2' वर्णों की सन्निहित घटनाओं की संख्या को संयोजित करने से स्ट्रिंग S ही उत्पन्न होती है।
- स्ट्रिंग S के पहले कुछ घटक निम्नलिखित हैं - S ="1221121221221121122……"
- यदि हम क्रमागत '1' और '2' को S में समूहित करते हैं, तो यह होगा - 1 22 11 2 1 22 1 22 11 2 11 22 ...... और प्रत्येक समूह में '1' या '2' का आना हैं - 1 2 2 1 1 2 1 2 2 1 2 2 ......
अब मान लीजिए कि हमारे पास इनपुट के रूप में एक पूर्णांक N है, जादुई स्ट्रिंग S में पहले N नंबर में '1' की संख्या ज्ञात करें। इसलिए यदि इनपुट 6 जैसा है, तो आउटपुट 3 होगा, जैसा कि जादुई स्ट्रिंग में पहले 6 तत्व हैं। "12211" है। इसमें तीन 1s हैं, इसलिए 3 लौटाएं।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- यदि n <=0 है, तो 0 लौटाएं, यदि n <=3, तो 1 लौटाएं
- ret :=1, आकार n की एक सरणी arr बनाएं
- गिरफ्तारी[0] :=1, गिरफ्तारी[1] :=2, गिरफ्तारी[2] :=2
- सिर:=2, पूंछ:=3 और अंक:=1
- जबकि पूंछ
- मैं के लिए 0 से एआर तक की सीमा में [सिर] - 1
- arr[tail] :=num
- यदि संख्या 1 है और पूंछ
- पूंछ को 1 से बढ़ाएं
- अगर पूंछ>=n, तो लूप तोड़ें
- संख्या =अंक XOR 3
- सिर 1 से बढ़ाएं
- मैं के लिए 0 से एआर तक की सीमा में [सिर] - 1
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: int magicalString(int n) { if(n <= 0) return 0; if(n <= 3) return 1; int ret = 1; vector <int> arr(n); arr[0] = 1; arr[1] = 2; arr[2] = 2; int head = 2; int tail = 3; int num = 1; while(tail < n){ for(int i = 0; i < arr[head]; i++){ arr[tail] = num; if(num == 1 && tail < n) ret++; tail++; if(tail >= n) break; } num ^= 3; head++; } return ret; } }; main(){ Solution ob; cout << (ob.magicalString(6)); }
इनपुट
6
आउटपुट
3