Comment se préparer rapidement à un entretien d'embauche avec des questions sur les algorithmes et les technologies

Salutations à tous les lecteurs de Habr! Je m'appelle Yuriy, j'enseigne les hautes technologies, Oracle, Microsoft et autres depuis plus de 20 ans, ainsi que la création, le développement et la prise en charge de systèmes d'information chargés pour divers clients commerciaux. Aujourd'hui, je voudrais vous parler de la direction actuelle: des entretiens sur les technologies de traitement des données. La variante russe de cet article, vous pouvez la trouver ici .

Cela n'a pas vraiment de sens pour un employeur de poser des questions au demandeur au sujet des technologies de programmation traditionnelles. C'est pourquoi je vais vous dire comment vous préparer à un entretien dans un seul domaine étroit lié aux langages de traitement de l'information, à savoir le traitement des longs entiers (longue arithmétique) et l'identification des propriétés d'information des objets du monde réel, qui sont décrits en longs entiers.

1. Les entretiens sur les technologies de traitement des données sont normalement organisés pour embaucher des équipes d'analystes et de développeurs qui ont déjà eu une expérience de développement dans des langages déclaratifs, impératifs, orientés objet et fonctionnels.

Tâche Déterminez le langage de programmation par le fragment de programme suivant.



Vous devez d'abord répondre à la question: quelles fonctionnalités dans la langue choisie peuvent être pertinentes et attireront l'employeur potentiel? En fonction de cela, la liste peut varier d'une version à l'autre, d'une bibliothèque à l'autre, d'une implémentation à l'autre.



Tâche Quelles langues prennent en charge l'arithmétique avec des entiers longs?

Prêt à répondre? Voici une liste suggérée:
  • C, C ++ - bibliothèque libgmp
  • Lisp commun - ne limite pas la largeur de bits des entiers
  • Type numérique intégré à Erlang (entier ())
  • Types Go-Int et Rat de la grande bibliothèque.
  • Type Integer intégré à Haskell
  • Java-java class.math.BigInteger (février 1997)
  • Bibliothèque OCaml-num
  • Pascal - bibliothèque Delphi-MPArith
  • Modules Perl Bignum et Bigrat
  • Module PHP BCMath
  • Python est un type long intégré (depuis la création du langage, février 1991)
  • Rubis - type Bignum
  • Classe Scala-BigInt
  • Schéma-avec R6RS
  • Langages .NET - Classe système.Numerics.BigInteger (introduit dans .NET Framework 4.0, il y a presque 10 ans)


2. Si l'employeur a déjà une liste toute faite, il est nécessaire de distinguer les parties générales des langues qui seront discutées lors de l'entretien.

Tâche À votre avis, quelles sont les langues les plus populaires du point de vue de l'employeur? Ici vous pouvez voir la réponse basée sur des statistiques.

Un certain nombre de ces opérations de routine sont souvent effectuées dans des systèmes d'information de grande et de très grande taille. Il existe différents types de tri, recherche de certains critères, algorithmes sur les graphiques, problèmes d'optimisation sur des ensembles de nature différente, tâches de conception d'objets aux propriétés incertaines. Mais en raison de l'ampleur de ces tâches, le tri le plus simple peut prendre un mois, la recherche peut prendre une semaine. Voir la tâche ci-dessous pour une meilleure compréhension.

Tâche Imaginez qu'il y ait un bouleau à l'extérieur de votre bureau. Selon vos calculs, il y a 100 000 feuilles dessus et le diamètre du tronc à sa racine est de 60 centimètres. Écrivez ces paramètres dans n'importe quelle notation mathématique. Prouver sa pertinence: a) pour une communication écrite avec un collègue au cas où l'arbre allait être coupé, b) pour effectuer un traitement informatique de son image.



3. Quelques mots sur la partie mathématique de l'entretien. Dans la vraie vie, nous dépassons rarement les limites de l'arithmétique ordinaire. Certains d'entre nous utilisent les réalisations de l'algèbre et de l'analyse. J'ai donc décidé d'ajouter quelques problèmes réels pour mettre la tête en route.

Tâche Pourquoi les numéros de téléphone étaient-ils à cinq ou six chiffres pendant si longtemps? Il y a une liste de nombres - lesquels ne sont pas des carrés complets? Combien d'autobus dans votre ville ont un numéro composé uniquement de carrés complets? Combien de nombres premiers jusqu'à 100 connaissez-vous? Quel est leur pourcentage dans la rangée de chiffres de 1 à 100? Soit 2, 3, 5, 7 des nombres premiers, selon ce fait, trouvez la quantité de nombres premiers jusqu'à 100. Combien d'opérations arithmétiques devrez-vous effectuer? Résolvez le même problème dans MS Excel de deux manières comme un auto-test.

Tâche Comment la convexité et la concavité sont-elles utilisées dans la pratique? Donnez 2-3 exemples d'utilisation de la convexité-concavité.



4. Parfois, il est nécessaire de parcourir la documentation du système / langage / ensemble de bibliothèques, des exemples de descriptions techniques approfondies et étendues de l'auteur / fabricant. Cela est particulièrement nécessaire si vous avez l'intention d'appeler des bibliothèques non standard.

Tâche Écrivez l'algorithme Euclid étendu dans l'un des langages de programmation mentionnés ci-dessus à l'étape 1. Dans quel langage n'est-il pas nécessaire de le faire? Pourquoi?

5. Ce serait bien de comprendre le sens de l'entretien: si vous êtes censé écrire des algorithmes par vous-même ou si vous devez maintenir un ensemble d'algorithmes tiers, vous devrez probablement introduire un ordre approprié plus tard?

Tâche Il y a des notes prises par un médecin en chef dans le cahier de son stagiaire. Il est nécessaire d'informatiser ces notes afin de prendre des rendez-vous corrects avec les patients. Que conseilleriez-vous au stagiaire?



6. Si le choix de la langue de l'entretien est implicite, il est préférable d'en choisir une plus standardisée, afin que l'intervieweur n'ait pas beaucoup de possibilité de changer les conditions des tâches pendant la conversation.

Tâche Combien de versions de Pascal ont été créées au cours des 25 dernières années? Spécifiez les forces et les faiblesses de chaque version.



7. Il serait bon d'assister à au moins un séminaire sur les algorithmes et leur mise en œuvre dans le produit d'information choisi dans un domaine donné.

Tâche Le poète vous a demandé s'il lui était possible d'écrire un poème "Eugene Onegin" en tenant compte du thésaurus de son auteur. Donnez deux solutions à ce problème.

8. Sur le site pour les programmeurs, il y a des tâches pour la formation de la capacité à traiter l'information scientifique et à programmer des algorithmes complexes. Ci-dessous, nous donnons une solution "frontale", mais elle n'est pas optimale. Ce n'est qu'une formulation de la condition du point de vue du langage de programmation de haut niveau.
S'il vous plaît, faites attention au fait que malgré tous les efforts des auteurs pour formuler les problèmes, certaines erreurs peuvent encore être présentes. Il est donc possible de discuter des problèmes survenus.

Tâche 489 du projet Euler


Soit G(a,b) être le plus petit entier non négatif n pour lequel GCD(n3+b,(n+a)3+b) est maximisé.
Par exemple, G(1,1)=5 parce que GCD(n3+1,(n+1)3+1) atteint sa valeur maximale de 7 pour n=5 et est plus petit pour 0 $ ≤ n <5 $ .
Soit H(m,n)=ΣG(a,b) pour 1am , 1bn .
On vous donne H(5,5)=128878 et H(10,10)=32936544 .

Trouver H(18,1900) .

Tâche heureusement, c'est un problème très rarement résolu sur le projet Euler. Sur la base du texte du programme, trouvez les forces et les faiblesses de l'algorithme et spécifiez-les. Ce programme pourra-t-il résoudre ce problème au cours d'une journée de travail? Comment l'accélérer? Spécifiez les erreurs dans la tâche, le cas échéant. Recherchez le paramètre " verylargenumber ". Par quoi est-il limité?

Encore quelques mots si vous ne pouvez pas le résoudre
Si nous parlions de maxima locaux, les réponses devraient être moindres, mais après les calculs, il s'avère soudain que nous parlons de maxima globaux, qui ne sont pas mentionnés dans le texte du problème. Et pourtant, on soupçonne que le GCD(n3+1444,(n+1)3+1444)=1 sous tout n . Que va n convient-il aux auteurs du problème?

Code de l'exemple de solution
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. Je vous souhaite de passer l'interview sur le haut et le haut!

UPD Spécialement pour la publication de la version anglaise de l'article, nous donnons quelques relations non triviales trouvées après une profonde modernisation de la solution ci-dessus. Lors du calcul de n = 500 000 000 $ .
GCD(n3+1444,(n+1)3+1444)=56298673,n=28147170 ; GCD(n3+1445,(n+1)3+1445)=14094169,n=14092001 ; GCD(n3+1446,(n+1)3+1446)=56454733,n=28225197 ; GCD(n3+1447,(n+1)3+1447)=14133211,n=14131040 .

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


All Articles