डेटा संरचनाओं और एल्गोरिथ्म से सबसे लोकप्रिय सवाल में से एक, ज्यादातर टेलिफोनिक साक्षात्कार पर पूछा गया।
डेटा संरचनाओं और एल्गोरिथ्म से सबसे लोकप्रिय सवाल में से एक, ज्यादातर टेलिफोनिक साक्षात्कार पर पूछा गया।
जवाबों:
धोखा देकर, और एक ही समय में दो पास करने से, समानांतर में। लेकिन मुझे नहीं पता कि भर्ती करने वालों को यह पसंद आएगा।
एक अच्छी लिंक के साथ एक ही लिंक की गई सूची पर किया जा सकता है। सूची में दो पॉइंटर्स यात्रा करते हैं, एक दोहरी गति के साथ। जब तेज एक अंत तक पहुंचता है, तो दूसरा एक आधा रास्ता होता है।
यदि यह एक दोगुनी लिंक की गई सूची नहीं है, तो आप बस एक सूची को गिन और उपयोग कर सकते हैं, लेकिन इसके लिए सबसे खराब स्थिति में आपकी मेमोरी को दोगुना करने की आवश्यकता होती है, और यह तब काम नहीं करेगा जब सूची मेमोरी में स्टोर करने के लिए बहुत बड़ी हो।
एक सरल, लगभग मूर्खतापूर्ण समाधान, बस हर दो नोड्स के मध्य नोड में वृद्धि होती है
function middle(start) {
var middle = start
var nextnode = start
var do_increment = false;
while (nextnode.next != null) {
if (do_increment) {
middle = middle.next;
}
do_increment = !do_increment;
nextnode = nextnode.next;
}
return middle;
}
हेंड्रिक के जवाब पर विस्तार से
यदि यह एक दोहरी लिंक वाली सूची है, तो दोनों सिरों से पुनरावृति
function middle(start, end) {
do_advance_start = false;
while(start !== end && start && end) {
if (do_advance_start) {
start = start.next
}
else {
end = end.prev
}
do_advance_start = !do_advance_start
}
return (start === end) ? start : null;
}
दिया हुआ [1, 2, 3] => 2
1, 3
1, 2
2, 2
दिया हुआ [1, 2] => 1
1, 2
1, 1
दिया हुआ [1] => 1
दिया हुआ [] => null
लिंक्ड सूची के नोड्स की ओर इशारा करने में सक्षम पॉइंटर के साथ एक संरचना बनाएं और एक पूर्णांक चर के साथ जो सूची में नोड्स की संख्या की गिनती रखता है।
struct LL{
struct node *ptr;
int count;
}start;
अब में लिंक की गई सूची के पहले नोड के पते को स्टोर करें और प्रारंभ करें । लिंक सूची में एक नया नोड के सफल निर्माण के बाद
सुनिश्चित करें कि का मूल्य एक से है। इसी तरह, जब भी लिंक की गई सूची से कोई नोड हटा दिया जाता है, तो इसे एक बार घटाएं।s t t a r t । सी ओ यू एन टी = 1 एस टी एक आर टी । c o u n t
एक एकल पास में मध्य तत्व को खोजने के लिए का उपयोग करें ।
डायनामिक ऐरे बनाएं, जहां एरे का प्रत्येक तत्व सूची में प्रत्येक नोड के लिए ट्रैवर्सिंग ऑर्डर में शुरुआत से शुरू होने वाला है। 1 से बना एक पूर्णांक, जो आपने कितने नोड्स का दौरा किया है, (जो हर बार जब आप एक नए नोड में जाते हैं तो वेतन वृद्धि) का ट्रैक रखता है। जब आप अंत तक पहुँचते हैं, तो आपको पता चलता है कि सूची कितनी बड़ी है, और आपके पास प्रत्येक नोड के लिए एक आदेशित सरणी है। अंत में, सूची के आकार को 2 से विभाजित करें (और 0-आधारित अनुक्रमण के लिए 1 घटाएं) और सरणी के उस सूचकांक में रखे गए सूचक को लाएं; यदि सूची का आकार विषम है, तो आप चुन सकते हैं कि किस तत्व को वापस करना है (मैं अभी भी पहले वाले को वापस करूंगा)।
यहाँ कुछ जावा कोड है जो बिंदु को पार करता है (भले ही एक गतिशील सरणी का विचार थोड़ा विस्की हो जाएगा)। मैं C / C ++ प्रदान करूंगा, लेकिन मैं उस क्षेत्र में बहुत कठोर हूं।
public Node getMiddleNode(List<Node> nodes){
int size = 1;
//add code to dynamically increase size if at capacity after adding
Node[] pointers = new Node[10];
for (int i = 0; i < nodes.size(); i++){
//remember to dynamically allocate more space if needed
pointers[i] = nodes.get(i);
size++;
}
return pointers[(size - 1)/2];
}
क्या रिकर्सन को एक से अधिक पास माना जाता है?
संदर्भ द्वारा पूर्णांक गणना पास करते हुए, सूची को अंत तक पीछे ले जाएं। बाद के संदर्भ के लिए प्रत्येक स्तर पर उस मूल्य की एक स्थानीय प्रतिलिपि बनाएँ, और अगली कॉल में जाने वाली रेफरी की संख्या बढ़ाएँ।
अंतिम नोड पर, गिनती को दो और ट्रंकट / फ्लोर () से विभाजित करें (यदि आप चाहते हैं कि पहला नोड "मध्य" हो जब केवल दो तत्व हों) या राउंड अप (यदि आप दूसरा नोड चाहते हैं मध्य")। एक शून्य या एक-आधारित सूचकांक का उचित रूप से उपयोग करें।
अनवाइंडिंग, स्थानीय काउंट (जो नोड की संख्या है) के लिए रेफरी काउंट से मेल खाता है। यदि बराबर है, तो उस नोड को वापस करें; पुन: पुनरावर्ती कॉल से वापस लौटा नोड।
।
ऐसा करने के अन्य तरीके हैं; उनमें से कुछ कम बोझिल हो सकते हैं (मुझे लगा कि मैंने देखा कि कोई व्यक्ति इसे एक सरणी में पढ़ता है और मध्य-कुडो को निर्धारित करने के लिए सरणी लंबाई का उपयोग करता है)। लेकिन स्पष्ट रूप से, कोई अच्छा जवाब नहीं हैं, क्योंकि यह एक बेवकूफ साक्षात्कार प्रश्न है। नंबर एक, जो अभी भी लिंक की गई सूची ( समर्थन राय ) का उपयोग करता है ; दो, मध्य नोड को खोजना एक मनमाना, अकादमिक अभ्यास है जिसका वास्तविक जीवन परिदृश्यों में कोई मूल्य नहीं है; तीन, अगर मुझे वास्तव में मध्य नोड जानने की जरूरत है, तो मेरी लिंक की गई सूची नोड संख्या को उजागर करेगी। यह उस संपत्ति को बनाए रखने के लिए आसान है जो हर बार पूरी सूची को बर्बाद करने की तुलना में मध्य नोड चाहता है। और अंत में, चार, प्रत्येक साक्षात्कारकर्ता को अलग-अलग उत्तरों को पसंद या अस्वीकार करने जा रहा है - जो एक साक्षात्कारकर्ता सोचता है कि वह चालाक है, दूसरा हास्यास्पद कहेगा।
मैं लगभग हमेशा अधिक प्रश्नों के साथ साक्षात्कार प्रश्नों का उत्तर देता हूं। अगर मुझे इस तरह का कोई प्रश्न मिलता है (मेरे पास कभी नहीं है), तो मैं पूछूंगा (1) आप इस लिंक की गई सूची में क्या संग्रह कर रहे हैं, और क्या वास्तव में ऐसा करने की आवश्यकता है, तो मध्य नोड तक कुशलता से पहुंचने के लिए एक अधिक उपयुक्त संरचना है। ; (२) मेरी अड़चनें क्या हैं? यदि स्मृति कोई समस्या नहीं है (उदाहरण सरणी उत्तर), तो मैं इसे तेज़ी से बना सकता हूं, लेकिन यदि साक्षात्कारकर्ता सोचता है कि स्मृति को ख़राब करना बेकार है, तो मैं चक्कर खाऊंगा। (३) मैं किस भाषा में विकसित होऊंगा? लगभग हर आधुनिक भाषा जो मुझे पता है कि अंतर्निहित सूचियों से निपटने के लिए अंतर्निहित कक्षाएं हैं जो सूची को अनावश्यक बनाते हैं - भाषा के डेवलपर्स द्वारा दक्षता के लिए ट्यून की गई चीज़ को फिर से क्यों बनाया जाए?
2 पॉइंटर्स का उपयोग करके। प्रत्येक पुनरावृत्ति में एक वृद्धि और हर दूसरे पुनरावृत्ति में अन्य। जब 1 पॉइंटर लिंक की गई सूची के अंत में जाता है, तो दूसरा पॉइंटर लिंक की गई सूची के मध्य मोड की ओर इशारा करेगा।