JavaRush /جاوا بلاگ /Random-SD /هڪ انٽرويو جي ڪهاڻي: دلچسپ سوال
GuitarFactor
سطح
Санкт-Петербург

هڪ انٽرويو جي ڪهاڻي: دلچسپ سوال

گروپ ۾ شايع ٿيل
تازو مون کي هڪ انٽرويو ۾ شرڪت ڪرڻ جو موقعو مليو هو هڪ وڏي آئي ٽي ڪمپنين مان هڪ انٽرنيشنل پوزيشن لاء. هڪ انٽرويو جي ڪهاڻي: دلچسپ سوال - 1هي منهنجو پهريون IT انٽرويو هو ۽، منهنجي خيال ۾، اهو دلچسپ نڪتو. مجموعي طور تي، مون کان 3 ڪلاڪن کان وڌيڪ "سوال" ڪيو ويو (اهو هوم ورڪ ۽ ڪمپيوٽر تي آفيس ۾ ٽيسٽ کان اڳ هو). مان انٽرويو وٺندڙ کي خراج تحسين پيش ڪرڻ چاهيان ٿو، جنهن سوال جو غلط جواب ڏيڻ تي همت نه هاري، پر هن جي اهم سوالن جي مدد سان مون کي سوچڻ ۽ صحيح جواب تي اچڻ تي مجبور ڪيو. هيٺ مان پيش ڪندس ڪيترائي ”خاڪا“ - منهنجي خيال ۾، ڪافي دلچسپ سوال، جن مان ڪجهه مون کي جاوا جي ڪجهه پهلوئن جي گهڻي ڄاڻ ڏني. ٿي سگهي ٿو ته اهي شيون ڪجهه ماڻهن کي پڌريون نظر اچن، پر مان سمجهان ٿو ته اهڙا به هوندا جن لاءِ هي مفيد ثابت ٿيندو. هيٺ ڏنل جملا هيٺ ڏنل فونٽ ۾ نمايان ٿيل آهن: انٽرويو وٺندڙ - بولڊ وائس اوور وضاحتن ۾ ۽ منهنجا خيال - اطالوي ۾ منهنجا جواب - باقاعده فونٽ ۾ اسان پس منظر سان ڪيو، اچو ته ڪاروبار ڏانهن وڃو)

خاڪو 1. ”هڪ بظاهر سادو طريقو“

لکو ته توهان هڪ طريقو ڪيئن لاڳو ڪندا، جيڪو نمبر a کي ورهائڻ جي نتيجي ۾ واپس اچي ٿو b. انٽرويو وٺندڙ ڪاغذ جي هڪ ٽڪري تي لکي ٿو
int divide(int a, int b) {
}
*مون طريقي جي دستخط سان ڪاغذ جي ٽڪري تي ناقابل اعتبار نظر ڪئي. پڪڙي ڇا آهي؟* مان لکان ٿو:
int divide(int a, int b) {
    return a/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غلطي جي صورت ۾ ڪهڙي قسم جو نتيجو واپس ڪيو وڃي. ۽ ڪالنگ جي طريقي ۾، مان استعمال ڪندس دليل ب کي چيڪ ڪرڻ لاءِ ته ڇا اهو صفر جي برابر آهي. اهو لڳي ٿو ته اهو جواب انٽرويو وٺندڙ کي مطمئن ڪيو، پر ايماندار ٿيڻ لاء، مون کي پڪ ناهي ته هي جواب غير واضح آهي))

اسڪيچ 2. ”ڪير تيز آهي؟

معياري سوال کان پوء، هڪ ArrayList هڪ LinkedList کان ڪيئن مختلف آهي، هي آيو: ڇا ٿيندو تيزيء سان - هڪ عنصر کي وچ ۾ ArrayListيا وچ ۾ داخل ڪرڻ LinkedList؟ * هتي مون ٽپو ڏنو، مون کي ياد آيو ته هر جڳهه مون ڪجهه پڙهيو آهي جهڙوڪ " LinkedListفهرست جي وچ ۾ عناصر داخل ڪرڻ يا ختم ڪرڻ لاء استعمال ڪريو." گهر ۾ مون JavaRush جي ليڪچرن کي به ٻه ڀيرا چيڪ ڪيو، اتي هڪ جملو آهي: “جيڪڏهن توهان هڪ مجموعي جي وچ ۾ ڪيترائي عنصر داخل ڪرڻ (يا حذف) ڪرڻ وارا آهيو، ته پوءِ توهان بهتر استعمال ڪندا LinkedList. ٻين سڀني حالتن ۾ - ArrayList". خودڪار طور تي جواب ڏنو ويو * اهو تيز ٿي ويندو LinkedList. مهرباني ڪري وضاحت ڪريو
  1. وچ ۾ هڪ عنصر داخل ڪرڻ لاءِ ArrayList، اسان لسٽ ۾ عنصر کي مسلسل وقت ۾ ڳوليندا آهيون، ۽ پوءِ لڪير واري وقت ۾، داخل ڪيل عنصر جي ساڄي پاسي عنصرن جي انڊيڪس کي ٻيهر ڳڻپ ڪندا آهيون.
  2. لاءِ LinkedList.. اسان پهرين وچ تي لڪير واري وقت ۾ پهچون ٿا ۽ پوءِ مسلسل وقت ۾ هڪ عنصر داخل ڪري، پاڙيسري عناصر لاءِ لنڪ تبديل ڪري رهيا آهيون.
پوء اهو نڪتو، جيڪو تيز آهي؟ Hm... اهو ساڳيو نڪتو. پر جڏهن اهو 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 کي نئين نوڊ طور LinkedList ۾ رکيو ويندو.

    نتيجو ڇا آهي؟ ڇا اهو ممڪن آهي ته ڪنهن شئي ۾ ڪنجي طور استعمال ڪرڻ HashMapغير اوور رائڊ سان equalshashcode؟

    نه توهان نٿا ڪري سگهو.

خاڪو 4. ”اچو ته ان کي مقصد سان ٽوڙيون!

Error ۽ Exception بابت سوالن کان پوءِ، ھيٺ ڏنل سوال ڪيو ويو: ھڪڙو سادو مثال لکو جتي ڪو فنڪشن اسٽيڪ اوور فلو اڇلائي ڇڏيندو. *پوءِ مون کي ياد آيو ته هن غلطي مون کي ڪيئن تڪليف ڏني جڏهن مان ڪجهه ريٽورسو فنڪشن لکڻ جي ڪوشش ڪري رهيو هوس* اهو شايد ريٽرسي ڪال جي صورت ۾ ٿيندو، جيڪڏهن ريٽرننگ کان نڪرڻ جي شرط غلط طور تي بيان ڪئي وئي آهي. *پوءِ مان ٿورو هوشيار ٿيڻ لڳس، آخر ۾ انٽرويو وٺندڙ مدد ڪئي، سڀ ڪجھ سادو ٿي ويو*
void sof() {
    sof();
}
هي غلطي ڪيئن مختلف آهي OutOfMemory؟ * مون هتي جواب نه ڏنو، صرف بعد ۾ مون محسوس ڪيو ته اهو هڪ سوال هو جاوا ميموري Stackجي ڄاڻ بابت Heap(آبجڪس جا ڪال ۽ حوالا اسٽيڪ ۾ محفوظ ٿيل آهن، ۽ شيون پاڻ کي Heap ياداشت ۾ محفوظ ٿيل آهن). ان جي مطابق، StackOverflow اڇلايو ويندو آهي جڏهن Stackايندڙ طريقي جي ڪال لاء ميموري ۾ وڌيڪ جاء نه هوندي آهي، ۽ ميموري OutOfMemory۾ شيون جي جاء ختم ٿي وئي آهي *Heap
ان انٽرويو جا اهي لمحا آهن جيڪي مون کي ياد آهن. آخر ۾، مون کي انٽرنيشنل شپ لاءِ قبول ڪيو ويو، تنهنڪري مون وٽ 2.5 مهينن جي تربيت آهي، ۽، جيڪڏهن سڀ ڪجهه ٺيڪ ٿي وڃي، ڪمپني ۾ نوڪري) جيڪڏهن دلچسپي آهي، ته آئون هڪ ٻيو مضمون لکي سگهان ٿو، هن وقت ننڍو، هڪ سادي پر مثالي مسئلي جو تجزيو جيڪو مون کي ڪنهن ٻئي ڪمپني ۾ انٽرويو ڏنو ويو هو. اهو سڀ ڪجهه مون لاءِ آهي، مون کي اميد آهي ته هي مضمون ڪنهن جي مدد ڪندو پنهنجي علم کي گہرا ڪرڻ يا منظم ڪرڻ ۾. هرڪو سکڻ خوش ٿيو!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION