JavaRush /جاوا بلاگ /Random-UR /ایک انٹرویو کی کہانی: دلچسپ سوالات
GuitarFactor
سطح
Санкт-Петербург

ایک انٹرویو کی کہانی: دلچسپ سوالات

گروپ میں شائع ہوا۔
حال ہی میں مجھے بڑی آئی ٹی کمپنیوں میں سے ایک میں انٹرن پوزیشن کے لیے انٹرویو میں شرکت کا موقع ملا۔ ایک انٹرویو کی کہانی: دلچسپ سوالات - 1یہ میرا پہلا آئی ٹی انٹرویو تھا اور، میری رائے میں، یہ دلچسپ نکلا۔ مجموعی طور پر، مجھ سے 3 گھنٹے سے زیادہ "پوچھ گچھ" کی گئی (اس سے پہلے ہوم ورک اور کمپیوٹر پر دفتر میں ٹیسٹ کیا گیا تھا)۔ میں انٹرویو لینے والے کو خراج تحسین پیش کرنا چاہتا ہوں، جس نے سوال کا غلط جواب دینے پر ہمت نہیں ہاری، بلکہ اپنے سرکردہ سوالات کی مدد سے مجھے سوچنے اور درست جواب پر آنے پر مجبور کر دیا۔ ذیل میں میں کئی "خاکے" پیش کروں گا - میری رائے میں، کافی دلچسپ سوالات، جن میں سے کچھ نے مجھے جاوا میں کچھ پہلوؤں کی گہری سمجھ دی۔ شاید یہ چیزیں کچھ لوگوں کو واضح معلوم ہوں گی، لیکن میرے خیال میں ایسے لوگ ہوں گے جن کے لیے یہ کارآمد ہوگا۔ ذیل میں جملے درج ذیل فونٹس میں نمایاں کیے گئے ہیں: انٹرویو لینے والا - بولڈ وائس اوور وضاحتوں میں اور میرے خیالات - ترچھے الفاظ میں میرے جوابات - باقاعدہ فونٹ میں ہم پس منظر کے ساتھ کام کر چکے ہیں، آئیے کاروبار پر اتریں)

خاکہ 1۔ "ایک بظاہر آسان طریقہ"

لکھیں کہ آپ ایک ایسا طریقہ کیسے نافذ کریں گے جو تعداد کو ب کے حساب سے تقسیم کرنے کا نتیجہ واپس کرتا ہے۔ انٹرویو لینے والا کاغذ کے ٹکڑے پر لکھتا ہے۔
int divide(int a, int b) {
}
*میں نے طریقہ کے دستخط کے ساتھ کاغذ کے ٹکڑے کی طرف حیرت سے دیکھا۔ کیچ کیا ہے؟* میں لکھتا ہوں:
int divide(int a, int b) {
    return a/b;
}
کیا اس طریقہ کار کے ساتھ کوئی مسئلہ ہے؟ *میں واقعی ایک احمق ڈمباس کو پکڑ رہا ہوں* بظاہر نہیں.. اگلا ایک جائز سوال آتا ہے: کیا ہوگا اگر b=0؟ *اوہ، اگر میں اسی طرح جاری رہا تو مجھے اس دفتر سے نکال دیا جائے گا!* اوہ ہاں، بالکل۔ یہاں ہمارے پاس int قسم کے دلائل ہیں، لہذا ایک ریاضی استثناء پھینک دیا جائے گا۔ اگر دلائل فلوٹ یا ڈبل ​​قسم کے تھے تو نتیجہ انفینٹی ہوگا۔ ہم اس کے بارے میں کیا کرنے جا رہے ہیں؟ میں کوشش/کیچ لکھنا شروع کر رہا ہوں۔
int divide(int a, int b) {
    try {
        return a/b;
    } catch (Exception e) {
        e.printStackTrace();
        return ... // ??? what the hack?
    }
}
*مجھے واپس جانا اور منجمد کرنا پڑتا ہے: کسی خرابی کی صورت میں کچھ واپس کرنے کی ضرورت ہے۔ لیکن اس "کچھ" کو حساب کے نتیجے سے کیسے الگ کیا جا سکتا ہے؟* ہم کیا واپس کریں گے؟ Hm... میں واپسی کے متغیر کی قسم کو Integer میں تبدیل کروں گا اور استثناء کی صورت میں میں null واپس کروں گا۔ آئیے تصور کریں کہ ہم قسم کو تبدیل نہیں کرسکتے ہیں۔ کیا ہم کسی طرح باہر نکل سکتے ہیں؟ شاید ہم رعایت کے ساتھ کچھ اور کر سکتے ہیں؟ *یہ آتا ہے* ہم اسے کال کرنے کے طریقہ پر بھی بھیج سکتے ہیں! ٹھیک ہے۔ یہ کیسا نظر آئے گا؟
int divide(int a, int b) throws ArithmeticException{
    return a/b;
}

void callDivide(int a, int b) {
    try {
        divide(a, b);
    } catch (ArithmeticException e) {
        e.printStackTrace();
    }
}
کیا استثنیٰ کو سنبھالنا ضروری ہے؟ ہاں، کیونکہ ہم اسے واضح طور پر تقسیم کے طریقہ سے آگے بڑھاتے ہیں۔ (*میں یہاں غلط تھا! صحیح جواب پر پہنچنے کے لیے انٹرویو لینے والے کے اہم سوالات درج ذیل ہیں*) اور ریاضی کا استثناء - یہ کس قسم کا استثناء ہے - چیک کیا گیا یا غیر چیک کیا گیا؟ یہ رن ٹائم استثناء ہے، جس کا مطلب ہے نشان زدہ۔ *یہاں قاتل سوال آتا ہے* تو پتہ چلتا ہے، آپ کے الفاظ میں، اگر ہم نے میتھڈ دستخط میں تھرو آرتھمیٹک استثناء کی وضاحت کی ہے، تو یہ چیک شدہ استثنا بن گیا؟ *اوہ!* شاید... نہیں۔ ہاں، یہ چلا گیا ہے۔ اگر ہم دستخط میں تھرو/غیر چیک شدہ استثناء/ کی نشاندہی کرتے ہیں، تو ہم صرف انتباہ دیتے ہیں کہ طریقہ استثنیٰ دے سکتا ہے، لیکن اسے کالنگ کے طریقہ کار میں ہینڈل کرنا ضروری نہیں ہے۔ یہ حل ہو گیا ہے۔ کیا غلطیوں سے بچنے کے لیے ہم کچھ اور کر سکتے ہیں؟ *کچھ سوچنے کے بعد* ہاں، ہم یہ بھی چیک کر سکتے ہیں کہ آیا (b==0)۔ اور کچھ منطق انجام دیں۔ ٹھیک ہے۔ تو ہم 3 طریقوں سے جا سکتے ہیں:
  • پکڑنے کی کوشش
  • تھرو - کال کرنے کے طریقہ پر آگے بڑھانا
  • دلیل کی جانچ پڑتال
اس صورت میں، divideآپ کے خیال میں کون سا طریقہ بہتر ہے؟
میں استثنیٰ کو کالنگ کے طریقہ کار میں آگے بھیجنے کا انتخاب کروں گا، کیونکہ... تقسیم کے طریقہ کار میں یہ واضح نہیں ہے کہ اس استثناء پر کیسے عمل کیا جائے اور intغلطی کی صورت میں کس قسم کا نتیجہ واپس کیا جائے۔ اور کالنگ کے طریقہ کار میں، میں دلیل b کا استعمال کروں گا کہ آیا یہ صفر کے برابر ہے۔ ایسا لگتا ہے کہ اس جواب نے انٹرویو لینے والے کو مطمئن کیا، لیکن سچ پوچھیں تو مجھے یقین نہیں ہے کہ یہ جواب غیر واضح ہے))

خاکہ 2۔ "کون تیز ہے؟"

معیاری سوال کے بعد، ایک ArrayList LinkedList سے کیسے مختلف ہے، یہ آیا: کیا تیزی سے ہوگا - کسی عنصر کو بیچ میں ArrayListیا درمیان میں داخل کرنا LinkedList؟ *یہاں میں نے چھلانگ لگائی، مجھے یاد آیا کہ میں نے ہر جگہ کچھ ایسا پڑھا ہے جیسے " LinkedListفہرست کے بیچ میں عناصر داخل کرنے یا ہٹانے کے لیے استعمال کریں۔" گھر میں میں نے JavaRush لیکچرز کو بھی دو بار چیک کیا، وہاں ایک جملہ ہے: "اگر آپ کسی مجموعہ کے بیچ میں بہت سے عناصر ڈالنے (یا حذف) کرنے جارہے ہیں، تو آپ بہتر استعمال کریں گے LinkedList۔ دیگر تمام معاملات میں - ArrayList" خودکار طور پر جواب دیا گیا* یہ کے ساتھ تیز تر ہوگا LinkedList۔ براہ کرم واضح کریں۔
  1. درمیان میں ایک عنصر داخل کرنے کے لیے ArrayList، ہم فہرست میں عنصر کو مستقل وقت میں تلاش کرتے ہیں، اور پھر داخل کیے گئے عناصر کے دائیں جانب، لکیری وقت میں دوبارہ گنتی کرتے ہیں۔
  2. کے لیے LinkedList.. ہم سب سے پہلے لکیری وقت میں وسط تک پہنچتے ہیں اور پھر ہمسایہ عناصر کے لیے روابط بدلتے ہوئے، مستقل وقت میں ایک عنصر داخل کرتے ہیں۔
تو یہ پتہ چلتا ہے، جو تیز ہے؟ ہمم... یہ وہی نکلتا ہے۔ لیکن یہ LinkedListتیز کب ہے؟ یہ پتہ چلتا ہے کہ جب ہم اسے فہرست کے پہلے نصف میں داخل کرتے ہیں۔ مثال کے طور پر، اگر آپ اسے بالکل شروع میں داخل کرتے ہیں، تو آپ کو ArrayListبالکل ٹیل تک تمام انڈیکس کا دوبارہ حساب لگانا پڑے گا، لیکن آپ کو LinkedListصرف پہلے عنصر کا حوالہ تبدیل کرنا ہوگا۔ اخلاقی: لفظی طور پر ہر اس چیز پر یقین نہ کریں جو لکھی ہے، یہاں تک کہ جاوا رش میں بھی!)

خاکہ 3۔ "ہم برابر اور ہیش کوڈ کے بغیر کہاں ہوں گے!"

مساوی اور ہیش کوڈ کے بارے میں بات چیت بہت طویل تھی - اسے کیسے اوور رائڈ کیا جائے، اس میں کیا نفاذ Object، ہڈ کے نیچے کیا ہوتا ہے، جب کوئی عنصر داخل کیا جاتا ہے HashMap، وغیرہ۔ میں صرف چند نکات کا حوالہ دوں گا جو میری رائے میں دلچسپ ہیں* تصور کریں کہ ہم نے ایک کلاس بنائی ہے۔
public class A {
    int id;

    public A(int id) {
        this.id = id;
    }
}
اور انہوں نے اوور رائڈ نہیں کیا equalsاور hashcode. بیان کریں کہ جب کوڈ پر عمل درآمد کیا جائے گا تو کیا ہوگا۔
A a1 = new A(1);
A a2 = new A(1);
Map<A, String> hash = new HashMap<>();
hash.put(a1, "1");
hash.get(a2);
*یہ اچھا ہے کہ انٹرویو سے پہلے میں نے بنیادی الگورتھم، ان کی پیچیدگی اور ڈیٹا کے ڈھانچے کو سمجھنے میں خاص طور پر چند دن گزارے - اس سے بہت مدد ملی، شکریہ CS50!*
  1. کلاس A کی دو مثالیں بنائیں

  2. ہم ایک خالی نقشہ بناتے ہیں، جس میں بطور ڈیفالٹ 16 ٹوکریاں ہوتی ہیں۔ کلید کلاس A کا ایک آبجیکٹ ہے، جس میں equalsاور طریقوں کو اوور رائڈ نہیں کیا جاتا ہے hashcode۔

  3. a1اسے نقشے میں رکھیں ۔ ایسا کرنے کے لیے، ہم پہلے ہیش کا حساب لگاتے ہیں a1۔

    ہیش کے برابر کیا ہوگا؟

    میموری میں سیل کا پتہ کلاس کے طریقہ کار کا نفاذ ہے۔Object

  4. ہیش کی بنیاد پر، ہم باسکٹ انڈیکس کا حساب لگاتے ہیں۔

    ہم اس کا حساب کیسے لگا سکتے ہیں؟

    *بدقسمتی سے، میں نے یہاں کوئی واضح جواب نہیں دیا۔ آپ کے پاس ایک لمبا نمبر ہے - ایک ہیش، اور 16 بالٹیاں ہیں - انڈیکس کی وضاحت کیسے کریں تاکہ مختلف ہیش والی اشیاء کو بالٹیوں میں یکساں طور پر تقسیم کیا جاسکے؟ میں تصور کرسکتا ہوں کہ انڈیکس کا حساب اس طرح کیا جاتا ہے:

    int index = hash % buckets.length

    پہلے ہی گھر میں میں نے دیکھا کہ سورس کوڈ میں اصل عمل درآمد کچھ مختلف ہے:

    static int indexFor(int h, int length)
    {
        return h & (length - 1);
    }
  5. ہم چیک کرتے ہیں کہ کوئی تصادم نہیں ہے اور a1 داخل کریں۔

  6. آئیے طریقہ کار کی طرف چلتے ہیں get۔ مثالیں a1 اور a2 کے مختلف ہونے کی ضمانت دی جاتی ہے hash(میموری میں مختلف پتہ)، لہذا ہمیں اس کلید کے لیے کچھ نہیں ملے گا۔

    کیا ہوگا اگر ہم اسے صرف hashcodeکلاس A میں دوبارہ بیان کریں اور ہیش میپ میں پہلے A1 کلید کے ساتھ اور پھر a2 کے ساتھ جوڑا ڈالنے کی کوشش کریں؟

    پھر سب سے پہلے ہم مطلوبہ ٹوکری تلاش کریں گے hashcode- یہ آپریشن صحیح طریقے سے کیا جائے گا. اس کے بعد، آئیے Entryکارٹ سے منسلک LinkedList میں موجود اشیاء کے ذریعے جانا شروع کریں اور کیز کا موازنہ کریں equals۔ کیونکہ equalsاوور رائڈ نہیں ہے، پھر بیس پر عمل درآمد کلاس سے لیا جاتا ہے Object- حوالہ کے لحاظ سے موازنہ۔ a1 اور a2 کے مختلف لنکس ہونے کی ضمانت ہے، لہذا ہم داخل کردہ عنصر a1 کو "چھوٹ" دیں گے، اور a2 کو لنکڈ لسٹ میں ایک نئے نوڈ کے طور پر رکھا جائے گا۔

    نتیجہ کیا ہے؟ کیا کسی شے میں کلید کے بطور HashMapنان اوور رائیڈڈ استعمال کرنا ممکن ہے equalshashcode؟

    نہیں تم نہیں کر سکتے.

خاکہ 4۔ "آئیے اسے جان بوجھ کر توڑ دیں!"

Error اور Exception کے بارے میں سوالات کے بعد، مندرجہ ذیل سوال آیا: ایک سادہ سی مثال لکھیں جہاں ایک فنکشن StackOverflow پھینک دے گا۔ *پھر مجھے یاد آیا کہ جب میں کچھ ریکسریو فنکشن لکھنے کی کوشش کر رہا تھا تو اس ایرر نے مجھے کس طرح دوچار کیا* یہ شاید ریکسریو کال کی صورت میں ہو گا، اگر ریکسری سے باہر نکلنے کی شرط غلط طریقے سے بیان کی گئی ہو۔ *پھر میں تھوڑا ہوشیار ہونے لگا، آخر میں انٹرویو لینے والے نے مدد کی، سب کچھ آسان نکلا*
void sof() {
    sof();
}
یہ غلطی اس سے کیسے مختلف ہے OutOfMemory؟ *میں نے یہاں جواب نہیں دیا، بعد میں میں نے محسوس کیا کہ یہ جاوا میموری Stackکے علم کے بارے میں ایک سوال ہے Heap(آجیکٹس کی کالز اور حوالہ جات اسٹیک میں محفوظ ہیں، اور اشیاء خود ہیپ میموری میں محفوظ ہیں)۔ Stackاس کے مطابق، اسٹیک اوور فلو کو اس وقت باہر پھینک دیا جاتا ہے جب اگلے میتھڈ کال کے لیے میموری میں مزید جگہ نہیں ہوتی ہے ، اور میموری OutOfMemoryمیں اشیاء کے لیے جگہ ختم ہوجاتی ہے *Heap
یہ انٹرویو کے وہ لمحات ہیں جو مجھے یاد ہیں۔ آخر میں، مجھے انٹرن شپ کے لیے قبول کر لیا گیا، اس لیے میرے پاس 2.5 ماہ کی تربیت ہے اور، اگر سب کچھ ٹھیک رہا تو، کمپنی میں نوکری) اگر دلچسپی ہو، تو میں ایک اور مضمون لکھ سکتا ہوں، اس بار چھوٹا، اس کے ساتھ ایک سادہ لیکن مثالی مسئلہ کا تجزیہ جو مجھے کسی اور کمپنی میں انٹرویو دیا گیا تھا۔ یہ سب میرے لیے ہے، مجھے امید ہے کہ یہ مضمون کسی کو اپنے علم کو گہرا کرنے یا منظم کرنے میں مدد کرے گا۔ سب کو سیکھنا مبارک ہو!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION