如果您在像Google或Amazon(以及其他許多...)這樣的公司中接受采訪,您知道會問技術問題,那麼您來了一個好地方做好準備!在此讀書中列出的是一堆技術計算機科學問題,這些問題都將在單獨的軟件包/類文件中回答。每個解決方案還可以包含一個關聯的演示文件,該文件將包含一個主要類和演示該解決方案,建議使用這些文件並了解所有角案例!
它不是因為無緣無故地組織!建議在解決一般面試問題之前對不同的數據結構以及各種搜索有良好的了解。這些將是您的工具,以幫助理解和解決不同的面試問題。做所有的方法是可選的,但是建議您至少對一O(nlogn)排序有良好的了解。
該讀數的設計簡單而快速,僅使用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。您需要一個新的節點類
反向單鏈接列表,方法標頭應該看起來像:
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]遞歸實施階乘。再次實施,但是這次使用尾部遞歸。什麼是尾部遞歸? Java是否針對尾部遞歸進行了優化?
[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個數字沒有重複,並且其他每個數字都有一個,並且只有一個重複。可能的輸入:[1、2、2、3、3、4、4],[2],[3、7、3]等...
對於方法標頭:
private static int uncoupledInteger ( int [] list ) 加分:您可以在恆定的內存和線性時間中進行嗎?
[p9]給定一個裝滿定界數的字符串,檢查字符串是否具有平衡的定界符。在此問題中,我們將擔心的唯一定界符是:[] {}()。除分界符外,該字符串中沒有其他字符。以下字符串是平衡的,應返回true:“”,“()”,“ {}()[],“([{}}])”。以下字符串不平衡,應該返回false:“ [“,” {}}“,” {{{]}“,” {[}]”
對於方法標頭:
private static boolean balancedDelimiters ( String delimiters ) [p10]給定整數和目標總和數組,如果目標總和是數組中的兩個整數的總和,則可以返回true的函數。例如,給定數組[1、2、3、4,-100、0、0]和目標5它應該返回true,因為4 + 1 = 5。請注意,如果給出了相同的數組,但是目標為8,則答案將返回false。您不能向其添加一個整數來產生目標,必須找到兩個單獨的整數。請注意,這兩個單獨的整數可能具有相同的值,例如。如果給出了相同的數組,但是給出了0作為目標,則應返回true,因為數組中有兩個整數,總和為0-第五索引中的0,第6索引中的0。
對於方法標頭:
private static boolean targetSummable ( int [] array , int target )