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

C++ . में सर्कुलर ऐरे लूप

मान लीजिए कि हमारे पास सकारात्मक और नकारात्मक पूर्णांक मानों की एक गोलाकार सरणी संख्या है। यदि सूचकांक में कोई संख्या k एक धनात्मक संख्या है, तो k चरणों को आगे बढ़ाएँ। अन्यथा, यदि यह ऋणात्मक (-k) है, तो k कदम पीछे ले जाएँ। चूंकि सरणी गोलाकार है, हम मान सकते हैं कि अंतिम तत्व का अगला तत्व पहला तत्व है, और पहले तत्व का पिछला तत्व अंतिम तत्व है। हमें यह जांचना है कि अंकों में लूप (या चक्र) है या नहीं। एक चक्र एक ही सूचकांक और चक्र की लंबाई> 1 पर शुरू और समाप्त होना चाहिए। इसलिए यदि इनपुट [2,-1,1,2,2] जैसा है, तो आउटपुट सत्य होगा, क्योंकि सूचकांक से एक चक्र है 0 -> 2 -> 3 -> 0 की लंबाई 3.

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • n :=अंकों का आकार


  • यदि n <2 है, तो झूठी वापसी करें


  • मैं के लिए 0 से n -1 की सीमा में, अंक [i]:=अंक [i] मॉड n

  • मेरे लिए 0 से n - 1 की सीमा में

    • अगर nums[i] =0, तो अगले पुनरावृत्ति के लिए जारी रखें;

    • धीमा =मैं, तेज़ =मैं;

    • जबकि अंक [धीमा] * अंक [तेज़]> 0 और अंक [तेज़ के अगले] * अंक [धीमे]> 0

      • धीमा =धीमा के आगे

      • उपवास :=अगले उपवास के बाद

      • अगर धीमा =तेज, तो

        • अगर धीमा =धीमा के बाद, फिर लूप से बाहर आएं

        • सही लौटें

    • एक्स:=अंक [i]

    • धीमा :=मैं

    • जबकि अंक [धीमा] * x> 0

      • अस्थायी :=धीमी गति के बाद

      • धीमी गति के आगे :=0

      • धीमा:=अस्थायी

  • झूठी वापसी

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int next(vector<int>& nums, int i){
      int n = nums.size();
      return (n+nums[i]+i)%n;
   }
   bool circularArrayLoop(vector<int>& nums) {
      int n = nums.size();
      if(n < 2) return false;
      for(int i = 0; i < n; i++)nums[i] %= n;
      for(int i = 0; i < n; i++){
         if(nums[i] == 0) continue;
         int slow = i;
         int fast = i;
         while(nums[slow] * nums[fast] > 0 && nums[next(nums, fast)] * nums[slow] > 0){
            slow = next(nums, slow);
            fast = next(nums, next(nums, fast));
            if(slow == fast){
               if(slow == next(nums, slow))
               break;
               return true;
            }
         }
         int x = nums[i];
         slow = i;
         while(nums[slow] * x > 0){
            int temp = next(nums, slow);
            nums[slow] = 0;
            slow = temp;
         }
      }
      return false;
   }
};
main(){
   vector<int> v = {2,-1,1,2,2};
   Solution ob;
   cout << (ob.circularArrayLoop(v));
}

इनपुट

[2,-1,1,2,2]

आउटपुट

1

  1. सी ++ में कतार का ऐरे कार्यान्वयन

    क्यू एक रैखिक डेटा संरचना है जिसमें संचालन का क्रम फीफो (फर्स्ट इन फर्स्ट आउट) है। सरणी एक डेटा संरचना है जिसमें समान डेटा प्रकार के तत्व होते हैं, जो निरंतर स्मृति स्थान में संग्रहीत होते हैं। कतार में सम्मिलन और विलोपन संचालन कतार के विपरीत छोर पर किया जाता है। स्टैक की तुलना में कार्यान्वयन थोड

  1. सी ++ स्ट्रिंग्स की सरणी

    इस खंड में हम देखेंगे कि C++ में स्ट्रिंग्स की एक सरणी को कैसे परिभाषित किया जाए। जैसा कि हम जानते हैं कि सी में कोई तार नहीं था। हमें कैरेक्टर ऐरे का उपयोग करके स्ट्रिंग्स बनाना है। इसलिए स्ट्रिंग्स की कुछ सरणी बनाने के लिए, हमें वर्णों की एक 2-आयामी सरणी बनानी होगी। प्रत्येक पंक्तियाँ उस मैट्रिक्स

  1. सी++ में छँटाई

    इस खंड में हम देखेंगे कि C++ में सॉर्टिंग एल्गोरिथम कैसे किया जाता है। एक क्रमबद्ध सरणी एक सरणी है जिसमें प्रत्येक तत्व को किसी क्रम में क्रमबद्ध किया जाता है जैसे संख्यात्मक, वर्णानुक्रम आदि। संख्यात्मक सरणी को सॉर्ट करने के लिए कई एल्गोरिदम हैं जैसे कि बबलसॉर्ट, इंसर्शन सॉर्ट, सेलेक्शन सॉर्ट, मर्ज