ডেটা স্ট্রাকচার এবং অ্যালগরিদম থেকে সর্বাধিক জনপ্রিয় প্রশ্নগুলির একটি, বেশিরভাগ টেলিফোনিক সাক্ষাত্কারে জিজ্ঞাসা করা হয়েছিল।
ডেটা স্ট্রাকচার এবং অ্যালগরিদম থেকে সর্বাধিক জনপ্রিয় প্রশ্নগুলির একটি, বেশিরভাগ টেলিফোনিক সাক্ষাত্কারে জিজ্ঞাসা করা হয়েছিল।
উত্তর:
প্রতারণা করে, এবং একই সাথে দুটি সমান্তরালে পাস করে। তবে নিয়োগকারীরা এটি পছন্দ করবেন কিনা তা আমি জানি না।
একটি সুন্দর কৌশল সহ একক সংযুক্ত তালিকায় করা যেতে পারে be দুটি পয়েন্টার তালিকার উপরে ভ্রমণ করে, একটি দ্বিগুণ গতির সাথে। দ্রুত যখন শেষটি পৌঁছে, অন্যটি অর্ধপথ হয়।
যদি এটি দ্বিগুণ সংযুক্ত তালিকাগুলি না হয় তবে আপনি কেবল তালিকাটি গণনা করতে এবং ব্যবহার করতে পারেন তবে এটির জন্য সবচেয়ে খারাপ ক্ষেত্রে আপনার স্মৃতিশক্তি দ্বিগুণ করা দরকার এবং তালিকাটি মেমরির মধ্যে সঞ্চয় করতে খুব বেশি বড় হলে এটি কাজ করবে না।
একটি সহজ, প্রায় নিরীহ সমাধান, প্রতি দুটি নোডের মাঝারি নোডকে কেবল বাড়িয়ে তোলা
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;
}
উপর elaborating হেনড্রিক এর উত্তর
যদি এটি দ্বিগুণ লিঙ্কযুক্ত তালিকাগুলি হয় তবে উভয় প্রান্ত থেকে পুনরাবৃত্তি করুন
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
একটি গতিশীল অ্যারে তৈরি করুন, যেখানে অ্যারের প্রতিটি উপাদান শুরু থেকে শুরু করে ট্র্যাভার্সিং ক্রমে তালিকার প্রতিটি নোডের পয়েন্টার। 1 তে শুরু করে একটি পূর্ণসংখ্যা তৈরি করুন, আপনি কতগুলি নোড পরিদর্শন করেছেন (যা প্রতিবার নতুন নোডে যাওয়ার সময় বৃদ্ধি হয়) এর উপর নজর রাখে। আপনি যখন শেষে পৌঁছেছেন, আপনি জানেন যে তালিকাটি কত বড়, এবং আপনার প্রতিটি নোডে পয়েন্টারের একটি আদেশযুক্ত অ্যারে রয়েছে। শেষ অবধি, তালিকাটির আকারটি 2 দ্বারা বিভক্ত করুন (এবং 0-ভিত্তিক সূচকের জন্য 1 বিয়োগ করুন) এবং অ্যারের সেই সূচকে রাখা পয়েন্টারটি আনুন; যদি তালিকার আকারটি বিজোড় হয় তবে কোন উপাদানটি ফিরতে হবে তা চয়ন করতে পারেন (আমি এখনও প্রথমটি ফিরিয়ে দেব)।
এখানে কিছু জাভা কোড রয়েছে যা পয়েন্টটি পারাপার করবে (যদিও ডায়নামিক অ্যারের ধারণাটি কিছুটা দুর্বল হবে)। আমি সি / সি ++ সরবরাহ করব তবে আমি সেই অঞ্চলে খুব মরিচা।
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];
}
পুনরাবৃত্তি একাধিক পাস হিসাবে বিবেচনা করা হয়?
রেফারেন্স দ্বারা একটি পূর্ণসংখ্যা গণনা পাস করে তালিকাটি শেষ দিকে ট্র্যাভার করুন। পরবর্তী রেফারেন্সের জন্য প্রতিটি স্তরে সেই মানের একটি স্থানীয় কপি তৈরি করুন, এবং পরবর্তী কলটিতে যাওয়া রেফ গণনা বৃদ্ধি করুন।
শেষ নোডে, গণনাটিকে দুটি দ্বারা বিভক্ত করুন এবং কাটা / মেঝে () কেটে ফেলুন (ফলাফলটি যদি আপনি চান তবে প্রথম নোডটি "মাঝারি" হয়ে উঠবে যখন কেবল দুটি উপাদান থাকবে) বা বৃত্তাকার (আপনি যদি দ্বিতীয় নোডটি চান মধ্যে"). একটি শূন্য- বা এক-ভিত্তিক সূচক যথাযথভাবে ব্যবহার করুন।
আনওয়াইন্ডিং, স্থানীয় অনুলিপি (যা নোডের সংখ্যা) এর সাথে রেফ গণনাটি মেলে। সমান হলে, সেই নোডটি ফিরিয়ে দিন; অন্যথায় পুনরাবৃত্তির কল থেকে ফিরে আসা নোডটি ফিরিয়ে দিন।
।
এটি করার অন্যান্য উপায়ও রয়েছে; তাদের মধ্যে কিছু কম ভারসাম্যপূর্ণ হতে পারে (আমি ভেবেছিলাম কেউ দেখেছি এটি অ্যারেতে পড়ে এবং মাঝের - কুডোগুলি নির্ধারণ করতে অ্যারের দৈর্ঘ্যটি ব্যবহার করতে)। তবে প্রকৃতপক্ষে, কোনও ভাল উত্তর নেই, কারণ এটি একটি মূ .় সাক্ষাত্কারের প্রশ্ন। এক নম্বর, যিনি এখনও লিঙ্কযুক্ত তালিকাগুলি ব্যবহার করেন ( সমর্থনকারী মতামত ); দুই, মধ্য নোড সন্ধান করা একটি স্বেচ্ছাসেবী, বাস্তব জীবনের পরিস্থিতিতে কোন মূল্য ছাড়াই একাডেমিক অনুশীলন; তিন, যদি সত্যিই আমার মাঝের নোডটি জানা দরকার, তবে আমার লিঙ্কযুক্ত তালিকার একটি নোডের গণনা প্রকাশ করা হবে। আমি মাঝারি নোডটি চাইলে প্রতিবার পুরো তালিকাটি অতিক্রম করে সময় নষ্ট করার চেয়ে এই সম্পত্তিটি বজায় রাখা সহজ l এবং পরিশেষে, চারটি, প্রতিটি সাক্ষাত্কারকারক বিভিন্ন উত্তর পছন্দ বা প্রত্যাখ্যান করতে চলেছে - একজন সাক্ষাত্কারকারী যেটাকে চতুর মনে করেন, অন্যজন হাস্যকর বলবেন।
আমি প্রায় সবসময় আরও প্রশ্নের সাথে সাক্ষাত্কারের প্রশ্নের উত্তর দিই। যদি আমি এর মতো একটি প্রশ্ন পাই (আমার কাছে কখনও নেই), আমি জিজ্ঞাসা করব (1) আপনি এই লিঙ্কযুক্ত তালিকায় কী কী সংরক্ষণ করছেন এবং যদি সত্যিই এমন করার প্রয়োজন হয় তবে মাঝখানে নোডকে দক্ষতার সাথে অ্যাক্সেস করার জন্য আরও উপযুক্ত কাঠামো রয়েছে কি? ; (২) আমার বাধা কি? আমি এটিকে দ্রুত করতে পারি যদি মেমরিটি কোনও সমস্যা না হয় (যেমন অ্যারের উত্তর) তবে যদি সাক্ষাত্কারকারী মনে করে যে মেমরিটি বাল্ক আপকে অপব্যয় করা হয়, আমি ডাইনিং হয়ে যাব। (3) আমি কোন ভাষায় বিকাশ করব? আমার পরিচিত প্রায় প্রতিটি আধুনিক ভাষার লিঙ্কযুক্ত তালিকাগুলি নিয়ে তালিকার জন্য অন্তর্নির্মিত ক্লাস রয়েছে যা তালিকাকে অযৌক্তিক করে তোলে - কেন ভাষাটির বিকাশকারীরা দক্ষতার জন্য সুরযুক্ত কিছুকে পুনরায় উদ্ভাবন করবেন?
2 পয়েন্টার ব্যবহার করে। প্রতিটি পুনরাবৃত্তিতে এক এবং অন্য দ্বিতীয় বারবারে বৃদ্ধি। যখন 1 ম পয়েন্টার লিঙ্কযুক্ত তালিকার শেষের দিকে নির্দেশ করে, তখন 2 য় পয়েন্টার লিঙ্কযুক্ত তালিকার মধ্য মোডে নির্দেশ করবে।