Como se preparar rapidamente para uma entrevista de emprego com perguntas sobre algoritmos e tecnologias

Saudações a todos os leitores de Habr! Meu nome é Yuriy, ensino técnicas de alta tecnologia, Oracle, Microsoft e outras há mais de 20 anos, além de criar, desenvolver e dar suporte a sistemas de informações carregados para vários clientes comerciais. Hoje eu gostaria de falar sobre a direção atual: entrevistas sobre tecnologias de processamento de dados. A variante russa deste post você pode encontrar aqui .

Realmente não faz sentido para um empregador perguntar ao candidato sobre as tecnologias de programação tradicionais. É por isso que vou lhe dizer como se preparar para uma entrevista em apenas uma área estreita relacionada a linguagens de processamento de informações, a saber, o processamento de números inteiros longos (aritmética longa) e a identificação de propriedades de informações de objetos do mundo real, que são descritos em números inteiros longos.

1. Normalmente, são realizadas entrevistas sobre tecnologia de processamento de dados para contratar equipes de analistas e desenvolvedores que já tiveram experiência em desenvolvimento em linguagens declarativas, imperativas, orientadas a objetos e funcionais.

Tarefa Determine a linguagem de programação pelo seguinte fragmento de programa.



Primeiro, você precisa responder à pergunta: quais recursos no idioma escolhido podem ser relevantes e atrair o potencial empregador? Dependendo disso, a lista pode variar de versão para versão, de biblioteca para biblioteca, de implementação para implementação.



Tarefa Quais idiomas suportam aritmética com números inteiros longos?

Pronto para responder? Aqui está uma lista sugerida:
  • C, C ++ - biblioteca libgmp
  • Lisp comum - não limita a largura de bits de números inteiros
  • Tipo numérico embutido em Erlang (número inteiro ())
  • Tipos Go-Int e Rat da grande biblioteca.
  • Tipo inteiro incorporado por Haskell
  • Java-java class.math.BigInteger (fevereiro de 1997)
  • Biblioteca OCaml-num
  • Pascal - biblioteca Delphi-MPArith
  • Módulos Perl bignum e bigrat
  • Módulo PHP BCMath
  • Python é um tipo longo embutido (desde que a linguagem foi criada, fevereiro de 1991)
  • Ruby - tipo Bignum
  • Classe Scala-BigInt
  • Esquema-com R6RS
  • Linguagens .NET - Classe do sistema.Numerics.BigInteger (introduzido no .NET Framework 4.0, quase 10 anos atrás)


2. Se o empregador já tiver uma lista pronta, é necessário destacar partes gerais dos idiomas que serão discutidos na entrevista.

Tarefa Na sua opinião, quais são os idiomas mais populares do ponto de vista do empregador? Aqui você pode ver a resposta com base nas estatísticas.

Muitas dessas operações de rotina são frequentemente realizadas em sistemas de informações grandes e ultra grandes. Existem diferentes tipos de classificação, pesquisa por determinados critérios, algoritmos em gráficos, problemas de otimização em conjuntos de diferentes naturezas, tarefas de design de objetos com propriedades incertas. Porém, devido à escala dessas tarefas, a classificação mais fácil pode levar um mês, a pesquisa pode levar uma semana. Veja a tarefa abaixo para uma melhor compreensão.

Tarefa Imagine que há uma árvore de bétula fora do seu escritório. Conforme calculado por seus colegas, há 100.000 folhas e o diâmetro do tronco na raiz é de 60 centímetros. Escreva esses parâmetros em qualquer notação matemática. Prove sua adequação: a) para comunicação por escrito com um colega, caso a árvore seja cortada; b) para executar o processamento da imagem por computador.



3. Algumas palavras sobre a parte matemática da entrevista. Na vida real, raramente vamos além dos limites da aritmética comum. Alguns de nós usam as conquistas da álgebra e da análise. Então, decidi adicionar alguns problemas da vida real para colocar suas cabeças em ação.

Tarefa Por que os números de telefone tinham cinco ou seis dígitos por tanto tempo? Há uma lista de números - quais deles não são quadrados completos? Quantos ônibus em sua cidade têm um número que consiste apenas de quadrados completos? Quantos primos até 100 você conhece? Qual é a porcentagem deles na linha de números de 1 a 100? Sejam 2, 3, 5, 7 números primos, de acordo com esse fato, encontre a quantidade de números primos em até 100. Quantas operações aritméticas você precisará fazer? Resolva o mesmo problema no MS Excel de duas maneiras como um autoteste.

Tarefa Como a convexidade e a concavidade são usadas na prática? Dê 2-3 exemplos de uso de convexidade-concavidade.



4. Às vezes é necessário consultar a documentação do sistema / idioma / conjunto de bibliotecas, exemplos de descrições técnicas detalhadas e ampliadas do autor / fabricante. Isso é especialmente necessário se você pretende chamar bibliotecas não padrão.

Tarefa Escreva o algoritmo Euclid estendido em uma das linguagens de programação mencionadas acima na etapa 1. Em que linguagem não é necessário fazer? Porque

5. Seria bom entender a direção da entrevista: se você deve escrever algoritmos sozinho ou se precisa manter um conjunto de algoritmos de terceiros, provavelmente precisará introduzir uma ordem adequada mais tarde?

Tarefa Há anotações feitas por um médico chefe no caderno de seu estagiário. É necessário informatizar essas anotações para marcar as consultas corretas. O que você recomendaria ao estagiário?



6. Se a escolha do idioma da entrevista estiver implícita, é melhor selecionar um idioma mais padronizado, para que o entrevistador não tenha muitas possibilidades de alterar as condições das tarefas durante a conversa.

Tarefa Quantas versões do Pascal foram criadas nos últimos 25 anos? Especifique os pontos fortes e fracos de cada versão.



7. Seria bom participar de pelo menos um seminário sobre algoritmos e sua implementação no produto de informação escolhido em uma determinada área.

Tarefa O poeta perguntou se é possível escrever um poema "Eugene Onegin", levando em consideração o dicionário de sinônimos de seu autor. Dê duas soluções para esse problema.

8. No site para programadores, existem tarefas para treinar a capacidade de processar informações científicas e programar algoritmos complexos. Abaixo, fornecemos uma solução "frontal", mas não é a ideal. É apenas uma formulação da condição do ponto de vista da linguagem de programação de alto nível.
Por favor, preste atenção ao fato de que, apesar do esforço de todos os autores em formular os problemas, alguns erros ainda podem estar presentes. Portanto, é possível discutir os problemas ocorridos.

Tarefa 489 do Projeto Euler


Vamos ser o menor inteiro não negativo para qual é maximizado.
Por exemplo, porque atinge seu valor máximo de para e é menor para .
Vamos para , .
Você é dado e .

Localizar .

Tarefa felizmente, esse é um problema muito raramente resolvido no Projeto Euler. Com base no texto do programa, encontre os pontos fortes e fracos do algoritmo e especifique-os. Este programa poderá resolver esse problema durante um dia útil? Como pode ser acelerado? Especifique erros na tarefa, se houver. Encontre o parâmetro " verylargenumber ". O que é limitado por?

Mais algumas palavras se você não conseguir resolvê-lo
Se estivéssemos falando sobre máximos locais, as respostas deveriam ser menores, mas, após os cálculos, subitamente acontece que estamos falando de máximos globais, que não são mencionados no texto do problema. E, no entanto, há uma suspeita de que o sob qualquer . O que será adequar os autores do problema?

Código para a solução de amostra
public class Start { static BigInteger[] GcdExtended(BigInteger a, BigInteger b) { BigInteger res[] = new BigInteger[3]; if (b == BigInteger.valueOf(0)) { res[0] = a; res[1] = BigInteger.valueOf(1); res[2] = BigInteger.valueOf(0); return res; } res = GcdExtended(b,a.divideAndRemainder(b)[1]); BigInteger s = res[2]; res[2] = res[1].subtract((a.divideAndRemainder(b)[0]).multiply(res[2])); res[1] = s; return res; } public static void main(String[]args) throws IOException { BigInteger i; BigInteger j; int n,n1; BigInteger temp; BigInteger temp1; BigInteger count; FileWriter fileWriter = new FileWriter("c:/temp/terribleanswer.txt"); n1=1; count=BigInteger.ZERO; i=BigInteger.ZERO; j=BigInteger.ZERO; temp1=BigInteger.ZERO; temp=BigInteger.ZERO; for (int a=1;a<19;a++) { for (int b=1;b<1901;b++) { for(n=1;n<;n++) { j=((BigInteger.valueOf(n)).pow(3)); j=j.add(BigInteger.valueOf(b)); i=(((BigInteger.valueOf(n)).add(BigInteger.valueOf(a))).pow(3)); i=i.add(BigInteger.valueOf(b)); int comparevalue = j.compareTo(i); if (comparevalue==0) { temp=GcdExtended(i,j); } else if (comparevalue == 1) { temp=GcdExtended(j,i); } else { temp=GcdExtended(i,j); } int compareTemp = temp.compareTo(temp1); if (compareTemp == 1) { temp1=temp; n1=n; continue; } } String fileContent = a + ";" + b +";"+ temp1 +";"+ n1 + "\n"; temp1=BigInteger.ZERO; count=count.add(BigInteger.valueOf(n1)); n1=1; try { fileWriter.append(fileContent); } catch (IOException e) { } } } String fileContent = count + "\n"; try { fileWriter.append(fileContent); } catch (IOException e) { } fileWriter.close(); } } 


9. Desejo que você passe na entrevista de maneira positiva!

UPD Especialmente para a publicação da versão em inglês do artigo, apresentamos algumas relações não triviais encontradas após uma profunda modernização da solução acima. Ao calcular para .
; ; ; .

Source: https://habr.com/ru/post/pt445002/


All Articles