Saudações a todos os leitores de Habr! Meu nome é Yuri, ensino técnicas de alta tecnologia, Oracle, Microsoft e outros 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.
Nas entrevistas desse plano, é inútil que o empregador pergunte ao candidato sobre tecnologias relacionadas à programação tradicional. Portanto, vou dizer popularmente como se preparar para uma entrevista em apenas uma área estreita relacionada a linguagens de processamento de informações, a saber,
processar inteiros longos (aritmética longa) e identificar propriedades de informações de objetos do mundo real que são descritos em números inteiros longos.
1. Entrevistas com perguntas sobre tecnologias de processamento de dados geralmente são realizadas com um conjunto de equipes de analistas e desenvolvedores que anteriormente possuíam experiência no desenvolvimento de linguagens declarativas, imperativas, orientadas a objetos e funcionais.
Desafio. Defina uma linguagem de programação por um pedaço de programa.

Portanto, primeiro você precisa se preparar para a pergunta - o que já é bom no idioma escolhido, o que poderia interessar a um potencial empregador? A propósito, a lista pode variar de versão para versão, de biblioteca para biblioteca, de implementação para implementação.
Desafio. Quais idiomas suportam aritmética com números inteiros longos?
Você já pensou? Lista de exemplo:- C, C ++ - biblioteca libgmp
- Lisp comum - não limita o comprimento de números inteiros
- Erlang - tipo numérico interno (inteiro ())
- Go - digite Int e Rat da grande biblioteca.
- Haskell - Tipo inteiro Inteiro
- Java - classe java.math.BigInteger (fevereiro de 1997)
- OCaml - biblioteca de números
- Pascal / Delphi - biblioteca MPArith
- Perl - módulos bignum e bigrat
- PHP - módulo BCMath
- Python - tipo longo embutido (desde que a linguagem foi criada, fevereiro de 1991)
- Ruby - tipo Bignum
- Scala - classe BigInt
- Esquema - com R6RS
- Linguagens .NET - classe System.Numerics.BigInteger (apareceu no .NET Framework 4.0, quase 10 anos atrás)
2. Se o empregador tiver compilado uma lista antecipadamente, será necessário isolar as partes comuns dos idiomas que serão discutidas na entrevista.
Desafio. 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.
Em sistemas de informação grandes e super grandes, são realizadas muitas vezes operações completamente rotineiras: várias classificações, pesquisa por determinados critérios, algoritmos em gráficos, problemas de otimização em conjuntos de diferentes naturezas, tarefas na construção de objetos com propriedades indefinidas. Porém, devido à escala da tarefa, a classificação mais simples pode levar um mês e a pesquisa pode levar uma semana. Uma tarefa aproximada de entendimento.
Desafio. Fora da janela é uma bétula. Nele, como seus colegas calcularam, 100.000 folhas, o diâmetro do tronco na raiz é de 60 centímetros. Registre os parâmetros especificados em qualquer notação matemática. E prove sua adequação: para correspondência com um colega, porque eles querem cortar a árvore. Ou para o processamento da imagem dele por computador.
3. Algumas palavras sobre a parte matemática. Na vida, raramente vamos além dos limites da aritmética comum. Unidades de nós usam as conquistas da álgebra e da análise matemática. Deixe as seguintes afirmações ajudá-lo a lembrar, mesmo que não superficialmente, onde o conhecimento esquecido é praticamente usado.
Desafio. Por que os números de telefone têm cinco ou seis dígitos há tanto tempo? Dada uma série de números - qual deles não é um quadrado completo? Quantos ônibus em sua cidade têm números quadrados completos? Quantos números primos até 100 você conhece? Quanto é uma porcentagem de todos os números de 1 a 100? Sejam 2, 3, 5, 7 primos, encontre o número de primos até 100. Quantas operações aritméticas você precisou fazer? Resolva o mesmo problema no MS Excel para autoteste de duas maneiras.
Desafio. Como as protuberâncias e concavidades são usadas na prática? Dê 2-3 exemplos do 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 próprio autor / fabricante. Isso é especialmente necessário se você pretende chamar bibliotecas não padrão.
Desafio. Escreva o algoritmo euclidiano estendido em uma das linguagens de programação indicadas acima, no parágrafo 1. Em que idioma isso não precisa ser feito? Porque
5. É aconselhável entender a direção da entrevista: você mesmo escreverá os algoritmos ou terá que manter um conjunto de algoritmos de terceiros, que eventualmente serão colocados em ordem?
Desafio. De acordo com o conjunto de prontuários do médico chefe, feito com caneta no caderno do estagiário, é necessário identificar de forma computadorizada para qual paciente as consultas foram realizadas. O que posso aconselhar ao estagiário?
6. Se a escolha do idioma da entrevista estiver implícita, é melhor optar por um idioma mais padronizado, para que o entrevistador não deseje alterar as condições das tarefas durante a conversa.
Desafio. Quantas versões da língua Pascal apareceram nos últimos 25 anos? Indique os pontos fortes e fracos de cada versão.
7. É aconselhável participar de pelo menos um seminário sobre algoritmos e sua implementação em soluções de informação prontas em uma determinada área.
Desafio. O poeta fez uma pergunta: ele pode escrever um poema “Eugene Onegin”, levando em conta o dicionário de sinônimos poético desse autor. Dê duas soluções para esse problema.
8. O
recurso para programadores tem tarefas para treinar a capacidade de processar informações científicas e programar algoritmos complexos. A seguir, apresentamos a solução “testa”, mas ela não é ótima e é apenas uma declaração da condição do ponto de vista de uma linguagem de programação de alto nível. Devido ao texto insuficientemente preciso do texto da tarefa, suas respostas podem não coincidir com as respostas fornecidas pelos autores desta tarefa.
Vamos
É o menor inteiro não negativo
para qual
tem o maior valor possível.
Por exemplo
desde
atinge o valor máximo
às
e tem valores menores em
. Vamos
para
,
.
Sabe-se que
e
. Localizar
.
Desafio. Felizmente, essa é uma tarefa raramente resolvida no Projeto Euler. De acordo com o texto do programa, encontre os pontos fortes e fracos do algoritmo e especifique-os. Este programa pode resolver esse problema em um dia útil? Como pode ser acelerado? Indique erros na tarefa, se houver. Encontre a opção "
muito grande ". Como é limitado?
Mais algumas palavras, se você não conseguir resolvê-lo.Se estivéssemos falando de máximos locais, as respostas deveriam ser menores, mas, depois de cálculos, de repente, estamos falando de máximos globais, sobre os quais não há uma palavra no texto do problema.
E, no entanto, há uma suspeita de que para qualquer . Quais irá atender os autores do problema?
Código para uma solução de exemplopublic 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ê tenha uma entrevista em um bom nível!
UPD Antes de publicar a
versão em inglês do artigo , damos algumas dicas não triviais
relações encontradas após profunda modernização da solução acima. Ao calcular até
.
;
;
;
.