Se você tem uma entrevista em uma empresa como Google ou Amazon (e muitos outros ...) que você sabe que fará perguntas técnicas, então você chegou a um bom lugar para se preparar! Listados neste ReadMe estão um monte de perguntas técnicas em ciência da computação que serão respondidas dentro de pacotes/arquivos de classe separados. Cada solução também pode incluir um arquivo de demonstração associado que conterá uma classe e demonstração principal dessa solução, é aconselhável brincar com isso e aprender sobre todos os casos de esquina!
Não está organizado assim sem motivo! Recomenda -se ter um bom entendimento de diferentes estruturas de dados, tipos e pesquisas antes de passar para problemas gerais de entrevistas. Essas serão suas ferramentas para ajudar a entender e resolver diferentes problemas de entrevistas. Fazer todos os tipos é opcional, mas é recomendável que você tenha um bom entendimento de no mínimo um (nLogn).
Este ReadMe foi projetado para ser simples e rápido para navegar usando apenas Control-F. Se você deseja rapidamente pular para algum lugar do ReadMe, basta pesquisar (usando o Control-F) para ele em colchetes. Verifique se sua pesquisa não é sensível ao minúsculo!
Opções de pesquisa rápida:
Se você encontrar algum erro no meu código, e haverá erros, tente corrigi -los como um exercício! Depois de pensar que você tem uma implementação em funcionamento, faça uma solicitação de tração, eu sempre aprecio a ajuda amigável :) Se você tiver alguma idéia de coisas que deseja adicionar, fique à vontade para codificá -lo e atirar em mim uma solicitação de tração, mantenha seu código limpo - código limpo ou nenhum código. Mais uma vez eu sempre aprecio ajuda e obrigado antecipadamente :)
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 ()Faça exatamente o mesmo da Pergunta 2, mas use uma lista de DoubleLinked. Você precisará de uma nova aula de nó
Reverter uma lista de singlylinkeds, o cabeçalho do método deve parecer:
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 ()Para todos os tipos, analise a velocidade usando a notação Big-O. Programar todos os tipos como métodos estáticos em classes individuais que têm um método principal que testa o tipo
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] Implementar fatorial recursivamente. Implemente -o novamente, mas desta vez use a recursão da cauda. O que é recursão de cauda? O Java é otimizado para recursão de cauda?
[P2] Resolva as famosas torres do problema de Hanói. É recursivo de cauda? Por que ou por que não?
[P3] Supondo que eu lhe dê uma variedade de números, digamos que eles representam os preços das ações, encontre -me o máximo de dinheiro que você poderia ganhar naquele dia comprando e vendendo uma única ação. Se as ações caírem o dia todo, você deverá me encontrar a menor quantia de dinheiro que eu poderia perder naquele dia. O cabeçalho do método deve parecer:
private static int bestStockTrade ( int [] stockPrices ) throws ...[P4] Dada uma matriz de números inteiros, por exemplo, [1, 2, 3, 4], retorne uma matriz em que em cada índice você obtém o resultado da multiplicação por todos os outros valores. Por exemplo. [1, 2, 3, 4] -> [2x3x4, 1x3x4, 1x2x4, 1x2x3]. Não use a divisão. O cabeçalho do método deve parecer:
private static int [] productAllButMe ( int [] data ) throws ...[P5] Dada uma variedade de números inteiros, qual é o produto máximo que você pode obter ao multiplicar qualquer 3 dos números inteiros. O cabeçalho do método deve parecer:
private static int productOfThree ( int [] data ) throws ...[P6] Dada uma matriz de pares de números inteiros, escreva uma função que passa e veja quais partes da linha do tempo são cobertas. Por exemplo. Dada a matriz de [(1,4), (2,7), (9,11), (1,3), (12,14)] -> [(1,7), (9,14)]. Você pode imaginar que isso fosse útil se tivéssemos uma lista de um cronograma de todos e queríamos ver quando todos estavam livres. Para a representação real da entrada, use a aula a seguir:
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 + ")" ;
}
}Para o cabeçalho do método:
private static List < Schedule > scheduler ( List < Schedule > schedules )[P7] Dada uma variedade de pessoas, onde uma pessoa é representada por um tempo de início e tempo de chegada para a mudança de trabalho, retorne a lista mais curta possível de pessoas em que essas pessoas veem todas as outras pessoas durante seus turnos. Por exemplo, se forem a essas pessoas (1, 2), (2, 10), (5, 6), você deve retornar (2, 10) porque essa pessoa vê todos os outros durante seu turno. Se dado (1, 5), (4, 10), (2, 3), (11, 13) -> (1, 5), (11, 13). Para a representação real da pessoa, use a seguinte classe:
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 + ")" ;
}
}Para o cabeçalho do método:
private static List < Person > selectPeople ( List < Person > people ) throws ...[P8] Dada uma variedade de números inteiros, onde é garantido um número que não é duplicado, encontre esse número. Observe que, nesta lista de números acoplados, apenas 1 número não tem duplicado e qualquer outro número tem um e apenas um duplicado. Entradas possíveis: [1, 2, 2, 3, 3, 4, 4], [2], [3, 7, 3] etc ...
Para o cabeçalho do método:
private static int uncoupledInteger ( int [] list ) Pontos extras: você pode fazer isso em memória constante e tempo linear?
[P9] Dada uma string cheia de delimitadores, verifique se a string tinha delimitadores equilibrados. Os únicos delimitadores com os quais nos preocuparemos neste problema são os seguintes: [] {} (). Não há outros caracteres nessa sequência, exceto os delimitadores. As seguintes seqüências de cordas são equilibradas e devem retornar true: "", "()", "{} () []", "([{}])". As seguintes strings não são equilibradas e devem retornar false: "[", "{}}", "{{]}", "{[}]"
Para o cabeçalho do método:
private static boolean balancedDelimiters ( String delimiters ) [P10] Dada uma matriz de números inteiros e uma soma alvo, faça uma função que retorne verdadeira se a soma alvo for uma soma de dois dos números inteiros na matriz. Por exemplo, dada a matriz [1, 2, 3, 4, -100, 0, 0] e o alvo 5, deve retornar verdadeiro porque 4 + 1 = 5. Observe que se a mesma matriz foi dada, mas o alvo foi 8, a resposta retornaria falsa. Você não pode adicionar um número inteiro para produzir o alvo, você deve encontrar dois números inteiros separados. Observe que esses dois números inteiros separados podem ter o mesmo valor, por exemplo. Se a mesma matriz foi dada, mas 0 foi dada como alvo, ela deve retornar verdadeira porque há dois números inteiros na matriz que soma para 0 - o 0 no 5º índice e o 0 no 6º índice.
Para o cabeçalho do método:
private static boolean targetSummable ( int [] array , int target )