पोस्ट के दूसरे भाग में,
"एल्गोरिदम और कॉन्सेप्ट्स" पर विचार किया जाएगा, यदि आपने पिछली पोस्ट नहीं पढ़ी है या विषयों की सूची "याद" करना चाहते हैं,
तो यहां एक नज़र डालें ।
एल्गोरिदम और अवधारणाएँ
क्रमबद्ध करें और खोजें
सुव्यवस्थित सॉर्टिंग एल्गोरिदम को समझना / जानना बहुत महत्वपूर्ण है, क्योंकि इसे हल करने के लिए सॉर्टिंग या खोज से संबंधित कई निर्णय, इन एल्गोरिदम के ज्ञान की आवश्यकता होती है। साक्षात्कारकर्ता को अपने ज्ञान को दिखाने का एक अच्छा तरीका जब कार्य को सॉर्ट करना है तो ज्ञात एल्गोरिदम को "रन" करना है और यह पता लगाना है कि कौन सा इस समस्या को हल करने के लिए सबसे उपयुक्त है। आप एक ही समस्या को हल करने के अपने "अलग" तरीकों से प्रसन्न होने के लिए एक समाधान और साक्षात्कारकर्ता दोनों प्राप्त करेंगे।
उदाहरण के लिए, "
आपके पास कर्मचारी वस्तुओं का एक बड़ा सरणी है, कर्मचारियों को उम्र के अनुसार क्रमबद्ध करें ।"
यहां आपको कम से कम दो चीजों पर ध्यान देने की जरूरत है। सबसे पहले, सरणी बड़ी है, जिसका अर्थ है सबसे पहले दक्षता, और दूसरी बात, छंटाई उम्र पर आधारित है, अर्थात, यह हमारे लिए पहले से ही स्पष्ट है कि मान थोड़े अंतराल में हैं। आप ब्लॉक सॉर्टिंग एल्गोरिदम का सुरक्षित रूप से उपयोग कर सकते हैं।
क्या एल्गोरिदम ज्ञात होना चाहिए (ये "ज्ञात" क्या हैं):- बबल सॉर्ट
- चयन के आधार पर छाँटें।
- मर्ज करना।
- त्वरित छाँट
- ब्लॉक सॉर्टिंग (बाल्टी सॉर्ट)।
उदाहरण
"
आपके पास दो सॉर्ट किए गए ए और बी हैं, ए का आकार सरणी बी को शामिल करने के लिए पर्याप्त बड़ा है। एक ऐसा तरीका लिखें जो सॉर्ट क्रम को संरक्षित करते हुए बी को ए में विलय करता है ।"
void merge(int a[], int b[], int n, int m) { int k = m + n - 1; int i = n - 1; int j = m - 1; while (i >= 0 && j >= 0) { if (a[i] > b[j]) { a[k--] = a[i--]; } else { a[k--] = b[j--]; } } while (j >= 0) { a[k--] = b[j--]; } }
खोज के साथ आप अपने आप को और अधिक "लाभप्रद" स्थिति में पाते हैं, यह रैखिक और द्विआधारी एल्गोरिदम और बात जानने के लिए पर्याप्त है, इसलिए बोलने के लिए, टोपी में है।
"
एक सरणी को देखते हुए जिसमें प्रत्येक पंक्ति और प्रत्येक स्तंभ को क्रमबद्ध किया जाता है, सरणी में तत्व को खोजने के लिए एक फ़ंक्शन लिखें ।"
नीचे दिए गए समाधान पर एक नज़र डालें और सबसे अच्छा समाधान सुझाएं:
bool find_element(int** mat, int elem, int M, int N) { int row = 0; int col = N - 1; while (row < M && col >= 0) { if (mat[row][col] == elem) { return true; } else if (mat[row][col] > elem) { --col; } else { ++row; } } return false; }
ध्यान दें कि यह वास्तव में यहां कोई बात नहीं है कि पोस्ट में कोड C ++ में है, ज्यादातर मामलों में समान कोड बिना किसी बड़े बदलाव के समान रूप से समकक्ष है, उदाहरण के लिए, जावा या C # कोड के लिए।
प्रतिबिंब के लिए कार्य:
"
द्विआधारी खोज एल्गोरिथ्म को लागू करें ।"
"
एक लाख फ़्लोटिंग पॉइंट संख्याओं की छंटाई कैसे व्यवस्थित करें? "।
"
वेतन द्वारा कर्मचारी वस्तुओं के सरणी को क्रमबद्ध करें (हम मानते हैं कि कर्मचारी के नाम, आयु, वेतन और पते के लिए फ़ील्ड शामिल हैं) ।"
प्रत्यावर्तन
पुनरावृत्ति के साथ बड़ी संख्या में कार्य होते हैं, कई कार्य पैटर्न का पालन करते हैं। यदि कार्य को उप-प्रकारों में विभाजित किया जा सकता है, तो यह पहले से ही एक संकेत है कि कार्य "पुनरावर्ती" है। यदि आप "
एन कोड लिखें जो पहले n को प्रदर्शित करता है ... " जैसे कार्यों को सुनता है, तो "
एक फ़ंक्शन को लागू करें जो सब कुछ समझता है ... ", तो पहले उपयोग करने का प्रयास करें, ठीक है, कम से कम समाधान की पुनरावर्ती पद्धति का उपयोग करने के बारे में सोचें।
यह ध्यान दिया जाना चाहिए कि सभी मामलों में, अभ्यास आपका सबसे अच्छा दोस्त है, आप कितने कार्यों को हल करते हैं, यह आपके लिए आसान हो जाता है न केवल एक नए को हल करने के लिए, बल्कि समस्या को हल करने के तरीके पर भी ध्यान दें।
और इसलिए, पहले उपशीर्षक को पहचानने का प्रयास करें। "मूल" समस्या को हल करें / ढूंढें, जिस पर पुनरावृत्ति बंद हो जाएगी (मूल रूप से यह एक हार्ड-कोडेड मूल्य है)। 2 के उपसमूह के लिए समस्या को हल करें और समझें कि दूसरे के आधार पर तीसरे उपमा को कैसे हल किया जाए। Nth उपमा के लिए समाधान को सारांशित करें।
याद रखें, पुनरावृत्ति की मदद से हल किए गए किसी भी कार्य का एक पुनरावृत्त समाधान भी है। और फिर भी, मुक्त स्थान के संदर्भ में एक पुनरावर्ती एल्गोरिथ्म बहुत अक्षम हो सकता है।
"
एक फ़ंक्शन लिखें जो nth फाइबोनैचि संख्या उत्पन्न करता है। "
पुनरावर्ती विकल्प:
int fibonacci(int n) { if (0 == n) { return 0; } if (1 == n) { return 1; }
वैकल्पिक विकल्प:
int fibonacci(int n) { if (n < 0) { return -1; } if (n == 0) { return 0; } int a = 1, b = 1; for (int i = 3; i <= n; ++i) { int c = a + b; a = b; b = c; } return b; }
विचार के लिए:
"
आप ऊपर की समस्या के समाधान को कैसे सुधारेंगे? "
"
एक फ़ंक्शन लिखें जो एक सेट के सभी सबसेट लौटाता है ।"
"
रानी के कार्य को हल करें "
बिट हेरफेर
कई अभ्यर्थियों के लिए मनुवादी बिट्स डरावने हो सकते हैं, हालांकि ऐसा नहीं होना चाहिए।
इन समस्याओं को हल करने में केवल एक गलती करना पर्याप्त है, इसलिए सावधान रहें, या बल्कि, सावधान रहें। आपके द्वारा लिखे गए कोड की प्रत्येक पंक्ति को ध्यान से देखें।
शिफ्ट के बारे में मत भूलना,
x << y (लेफ्ट शिफ्ट) का मतलब है कि x को y बिट्स और
x >> y (राइट शिफ्ट) द्वारा क्रमशः बाएं में स्थानांतरित किया जाता है, बिट्स में दाईं ओर।
एक काफी लोकप्रिय कार्य है, इसे स्वयं हल करने का प्रयास करें (मैं इसे "रिवर्स साइड" से उद्धृत करता हूं) - "
निम्नलिखित कोड को समझाओ: ((एन एंड (एन - 1)) == 0) "।
“
दो 32-बिट संख्या को देखते हुए, N और M. दो और बिट स्थिति हैं, i और j। एक ऐसा फंक्शन लिखिए जो I और j के बीच के सभी बिट्स को M के बराबर सेट करता है (यानी, M, N का एक विकल्प बन जाता है)
एक उदाहरण:
इनपुट: एन = १००००००००, एम = १०१, आई = २, जे = ३
आउटपुट: एन = 100010100 "।
int update_bits(int n, int m, int i, int j) { int max = ~0;
विचार के लिए: “
एक स्ट्रिंग के रूप में एक फ्लोटिंग-पॉइंट संख्या को देखते हुए, एक बाइनरी प्रतिनिधित्व प्रिंट करें। "
ऑब्जेक्ट ओरिएंटेड डिज़ाइन
ओओपी प्रश्न (यहां पी डिजाइन है) बहुत महत्व के हैं, कम से कम मुझे ऐसा लगता है। ओओपी के ज्ञान का साक्षात्कारकर्ता पर कुछ विश्वास होता है, क्योंकि यह स्पष्ट हो जाता है कि उम्मीदवार उस परियोजना के वर्ग आरेखों को "समझ" जाएगा, जिस पर वह काम करेगा। यह केवल एक छोटा सा प्लस है; पीएलओ के अन्य महत्वपूर्ण फायदे हैं जो उम्मीदवार का पक्ष लेते हैं। लेकिन ज्ञान की कमी से साक्षात्कारकर्ता को "कौन है?" यह, ज़ाहिर है, ओओपी से संबंधित पदों पर लागू होता है, अन्यथा, मेरी राय में, चालक डेवलपर से ओओपी के बारे में पूछा जाने की संभावना नहीं है। हालांकि, साक्षात्कार के दौरान, एक निश्चित आवेदन, या यहां तक कि एक "गैर-अनुप्रयोग", जैसे कि एक टेलीविज़न के रूप में डिजाइन करने के लिए कहा जाए। वे आपको एक रिमोट कंट्रोल और एक टीवी के बीच संबंधों के बारे में बात करने के लिए कहेंगे। "है-ए" से अलग "है-ए" जैसे सवालों के लिए कैसे तैयार रहें?
चैट सर्वर डिज़ाइन करें ।
enum status_type { online, offline, away }; struct status { status_type m_status_type; std::string m_status_message; }; struct add_request; class user { private: std::string m_username; std::string m_display_name; std::list<user*> m_contact_list; std::list<add_request*> requests; public: bool update_status(status_type stype, const std::string& msg); bool add_user_with_username(const std::string& name); bool approve_request(const std::string& username); bool deny_request(const std::string& username); bool remove_contact(const std::string& username); bool send_message(const std::string& username, const std::string& message); }; struct add_request { user* m_from_user; user* m_to_user; }; class server { user* get_user_by_username(const std::string& username); };
यह एक सरल उदाहरण है, वास्तव में, प्रश्न / कार्य "अच्छी गुणवत्ता" के हैं।
सोच के लिए: "
ऑनलाइन बुक रीडर के लिए डेटा संरचनाएं डिज़ाइन करें ।"
मुझे लगता है कि यह पर्याप्त है, निम्नलिखित पदों में न केवल प्रोग्रामिंग भाषा के बारे में लिखने का इरादा है, बल्कि अन्य विषयों / प्रश्नों के बारे में भी है जो अधिक जटिल साक्षात्कारों से संबंधित होंगे।