إذا كانت لديك مقابلة تخرج في شركة مثل Google أو Amazon (والعديد من الآخرين ...) التي تعرفها ستطرح أسئلة فنية ، فأنت قد وصلت إلى مكان جيد لإعداد نفسك! المدرجة في هذه القراءة هي مجموعة من أسئلة علوم الكمبيوتر الفنية التي سيتم الرد عليها جميعها داخل حزم منفصلة/ملفات الفصل. قد يتضمن كل حل أيضًا ملفًا تجريبيًا مرتبطًا والذي سيحتوي على فئة رئيسية وتوضيحان هذا الحل ، ويُنصح باللعب معها والتعرف على جميع حالات الزاوية!
لا يتم تنظيمه مثل هذا دون سبب! من المستحسن أن يكون لديك فهم جيد لهياكل البيانات المختلفة والفرز والبحث قبل الانتقال إلى مشاكل المقابلة العامة. ستكون هذه أدواتك للمساعدة في فهم وحل مشاكل المقابلة المختلفة. إن القيام بجميع هذه الأنواع أمر اختياري ، ولكن يوصى بأن يكون لديك فهم جيد على الأقل من نوع O (nlogn).
تم تصميم هذا ReadMe ليكون بسيطًا وسريعًا للتصفح باستخدام Control-F فقط. إذا كنت ترغب بسرعة في القفز إلى مكان ما في ReadMe ، ما عليك سوى البحث (باستخدام Control-F) في أقواس مربعة. تأكد من أن بحثك ليس حساسًا للحالة!
خيارات البحث السريع:
إذا وجدت أي أخطاء في الكود الخاص بي ، وستكون هناك أخطاء ، حاول إصلاحها كتمرين! بمجرد أن تظن أن لديك تطبيقًا عاملاً ، أطلقوا النار على طلب سحب لي ، فأنا أقدر دائمًا المساعدة الودية :) إذا كان لديك أي أفكار للأشياء التي تريد إضافتها ، فلا تتردد في ترميزه واطلاق النار علي طلب سحب ، فقط يرجى الحفاظ على رمزك نظيفًا - نظيفًا أو بدون رمز على الإطلاق. مرة أخرى أنا دائما أقدر المساعدة وشكر مقدما :)
public Queue ( int maxSize )
public void enqueue ( int data )
public int dequeue ()
public int peek ()
public boolean isFull ()
public boolean isEmpty ()
public String toString () public StackQueue ()
public StackQueue ( Type [] list )
public void enqueue ( Type obj )
public Type dequeue ()
public boolean isEmpty () public LinkedList ()
public Node < Type > find ( Type data )
public int getLength ()
public void addDataAtHead ( Type data )
public void addNodeAtHead ( Node < Type > nextNode )
public Node < Type > deleteHead () throws ...
public String toString ()افعل نفس السؤال 2 ، ولكن استخدم قائمة DoubleLinkedList. ستحتاج إلى فئة عقدة جديدة
عكس قائمة SinglyLinkedList ، يجب أن يبدو رأس الطريقة:
public void reverse () // put this method inside your LinkedList class public boolean cyclic () // put this method inside your LinkedList class public Stack ()
public Type pop ()
public void push ( Type data )
public Type peek ()
public String toString () public Heap ( int initialSize )
public Heap ( int [] initialValues )
public void add ( int integer )
public boolean delete ( int integer )
public int peek ()
public int pop ()
public boolean contains ( int integer )
public boolean isEmpty ()
public int size () public PriorityQueue ( int initialSize )
public PriorityQueue ( int [] list )
public void enqueue ( int data )
public int dequeue ()
public int peek ()
public boolean isEmpty () public BinarySearchTree ( Integer data )
public BinarySearchTree ()
public TreeNode find ( Integer searchKey )
public void insert ( TreeNode insertNode )
public boolean delete ( Integer searchKey ) // return true if object deleted, false if object not in list
public void inOrderTraversal ()
public void preOrderTraversal ()
public void postOrderTraversal ()
public TreeNode smallest ()
public TreeNode biggest ()لجميع الأنواع ، تحليل السرعة باستخدام تدوين Big-O. البرنامج كل الأنواع كطرق ثابتة في الفئات الفردية التي لكل منها طريقة رئيسية تختبر هذا النوع
private static void bubbleSort ( int [] list ) private static void selectionSort ( int [] list ) private static void insertionSort ( int [] list ) private static void mergeSort ( int [] list ) private static void quickSort ( int [] list ) private static void shellSort ( int [] list ) private static void countingSort ( int [] list , int startRange , int endRange ) private static void radixSort ( int [] list ) private static void bucketSort ( int [] list ) private static void heapSort ( int [] list ) private static int binarySearchArray ( int [] list , int searchKey )[P1] تنفيذ العامل بشكل متكرر. قم بتنفيذها مرة أخرى ، ولكن هذه المرة استخدم عودية الذيل. ما هو عودة الذيل؟ هل جافا مُحسّن لتكرار الذيل؟
[P2] حل الأبراج الشهيرة لمشكلة هانوي. هل هو ذيل عودية؟ لماذا أو لماذا لا؟
[P3] على افتراض أنني أعطيك مجموعة من الأرقام ، دعنا نقول إنها تمثل أسعار الأسهم ، وتجد لي أكبر عدد من الأموال التي يمكنك جنيها في ذلك اليوم من خلال شراء وبيع سهم واحد. إذا سقطت الأسهم طوال اليوم ، فيجب أن تجد لي أقل مبلغ من المال قد أخسره في ذلك اليوم. يجب أن يبدو رأس الطريقة مثل:
private static int bestStockTrade ( int [] stockPrices ) throws ...[P4] بالنظر إلى مجموعة من الأعداد الصحيحة ، على سبيل المثال [1 ، 2 ، 3 ، 4] ، إرجاع صفيف حيث تحصل في كل فهرس على نتيجة الضرب من جميع القيم الأخرى. على سبيل المثال. [1 ، 2 ، 3 ، 4] -> [2x3x4 ، 1x3x4 ، 1x2x4 ، 1x2x3]. لا تستخدم التقسيم. يجب أن يبدو رأس الطريقة مثل:
private static int [] productAllButMe ( int [] data ) throws ...[P5] بالنظر إلى مجموعة من الأعداد الصحيحة ، ما هو الحد الأقصى للمنتج الذي يمكن أن تحصل عليه من ضرب أي 3 من الأعداد الصحيحة. يجب أن يبدو رأس الطريقة مثل:
private static int productOfThree ( int [] data ) throws ...[P6] بالنظر إلى مجموعة من أزواج من الأعداد الصحيحة ، اكتب وظيفة تمر ومعرفة أي أجزاء من الجدول الزمني مغطى. على سبيل المثال. بالنظر إلى صفيف [(1،4) ، (2،7) ، (9،11) ، (1،3) ، (12،14)] -> [(1،7) ، (9،14)]. يمكنك أن تتخيل أن هذا مفيد إذا كان لدينا قائمة بجدول الجدول ، وأردنا أن نرى متى كان الجميع أحرارًا. للتمثيل الفعلي للمدخلات ، استخدم الفئة التالية:
class Schedule {
public int startTime ;
public int endTime ;
public Schedule ( int startTime , int endTime ) {
this . startTime = startTime ;
this . endTime = endTime ;
}
@ Override
public String toString () {
return "(" + startTime + " , " + endTime + ")" ;
}
}لرأس الطريقة:
private static List < Schedule > scheduler ( List < Schedule > schedules )[P7] بالنظر إلى مجموعة من الأشخاص ، حيث يتم تمثيل شخص ما في وقت بدء ووقت الانتهاء من تحول عملهم ، فإن إرجاع أقصر قائمة ممكنة للأشخاص حيث يرى هؤلاء الأشخاص جميع الأشخاص الآخرين أثناء نوباتهم. على سبيل المثال ، إذا أعطيت هؤلاء الأشخاص (1 ، 2) ، (2 ، 10) ، (5 ، 6) ، فيجب عليك العودة (2 ، 10) لأن هذا الشخص يرى الجميع أثناء نوبته. إذا أعطيت (1 ، 5) ، (4 ، 10) ، (2 ، 3) ، (11 ، 13) -> (1 ، 5) ، (11 ، 13). للتمثيل الفعلي للشخص ، استخدم الفصل التالي:
class Person {
public int startTime ;
public int finishTime ;
public Person ( int startTime , int finishTime ) {
this . startTime = startTime ;
this . finishTime = finishTime ;
}
@ Override
public String toString () {
return "(" + startTime + " , " + finishTime + ")" ;
}
}لرأس الطريقة:
private static List < Person > selectPeople ( List < Person > people ) throws ...[P8] بالنظر إلى مجموعة من الأعداد الصحيحة ، حيث يتم ضمان رقم واحد لم يتم تكراره ، ابحث عن هذا الرقم. لاحظ أنه في هذه القائمة من الأرقام المقترنة ، لا يوجد رقم واحد فقط لا يحتوي على نسخ ، وكل رقم آخر يحتوي على واحد واحد فقط. المدخلات المحتملة: [1 ، 2 ، 2 ، 3 ، 3 ، 4 ، 4] ، [2] ، [3 ، 7 ، 3] إلخ ...
لرأس الطريقة:
private static int uncoupledInteger ( int [] list ) نقاط إضافية: هل يمكنك القيام بذلك في ذاكرة ثابتة ووقت خطي؟
[P9] بالنظر إلى سلسلة مليئة بالحددات ، تحقق مما إذا كانت السلسلة تحتوي على محددات متوازنة. المحددات الوحيدة التي سنشعر بها في هذه المشكلة هي ما يلي: [] {} (). لا توجد أحرف أخرى في هذه السلسلة باستثناء المحددات. الأوتار التالية متوازنة ويجب أن تعود صحيح: "" ، "()" ، "{} () []" ، "([{}])". الأوتار التالية ليست متوازنة ويجب أن تعود خاطئة: "[" ، "{}}" ، "{{]}" ، "{[}]"
لرأس الطريقة:
private static boolean balancedDelimiters ( String delimiters ) [P10] بالنظر إلى مجموعة من الأعداد الصحيحة ومبلغ المستهدف ، قم بعمل وظيفة تُرجع إذا كان المبلغ المستهدف هو مجموع اثنين من الأعداد الصحيحة في الصفيف. على سبيل المثال ، بالنظر إلى الصفيف [1 ، 2 ، 3 ، 4 ، -100 ، 0 ، 0] والهدف 5 ، يجب أن يعود صحيحًا لأن 4 + 1 = 5. لاحظ أنه إذا تم إعطاء نفس الصفيف ، ولكن كان الهدف 8 ، فإن الإجابة ستعود كاذبة. لا يمكنك إضافة عدد صحيح إلى نفسه لإنتاج الهدف ، يجب أن تجد اثنين من الأعداد الصحيحة المنفصلة. لاحظ أن هذين الأعداد الصحيحة المنفصلة يمكن أن يكون لها نفس القيمة ، على سبيل المثال. إذا تم إعطاء نفس المصفوفة ولكن تم إعطاء 0 كهدف ، فيجب أن يعود صحيحًا لأن هناك اثنين من الأعداد الصحيحة في المصفوفة التي تصل إلى 0 - 0 في الفهرس الخامس و 0 في الفهرس السادس.
لرأس الطريقة:
private static boolean targetSummable ( int [] array , int target )