Parlons de la raison pour laquelle j'ai écrit cela en premier. Quand je suis allé à l'interview, je suis allé à la ville désignée d'Alibaba à 11 heures la veille de l'entretien, et j'ai trouvé un hôtel et je suis resté vers 1 heures. , ce qui a directement conduit aux mauvais résultats de l'entretien le lendemain (pour les grandes crevettes qui recherchent un emploi ne devraient pas dire une tragédie aux crevettes. Il est toujours très important de se préparer à l'avance). Une heure (quand je suis revenu de l'interview, j'étais presque endormi quand je suis allé, triste !!) Lorsque l'interview était sur le point de terminer, l'intervieweur m'a posé la question de la séquence de Fibonacci. Et je savais seulement que je devais définir trois variables ou les initialiser avec la liste. Fin, je ne peux pas écrire la première méthode suivante sous l'induction étape par étape de l'interviewer. Période d'or pour la réforme et l'extraction d'or (vous pouvez y aller rapidement si vous avez la capacité). Avec les déchets, pour l'analyse des données, Alibaba peut analyser les diverses données détaillées par l'utilisateur qu'elle a maîtrisées, et peut mieux localiser les goûts et les besoins des utilisateurs, offrant mieux une poussée précise et une poussée publicitaire précise. Si le rêve futur de Tencent est d'être l'eau, l'électricité et le gaz dans la vie des utilisateurs, alors le rêve futur possible d'Alibaba est la nourriture, les vêtements, le logement et le transport de l'utilisateur, la collecte de l'eau, de l'électricité et du gaz, etc. o (∩_∩) O ~ Tournons-nous vers le sujet.
Pour d'excellents concepteurs d'algorithmes, il n'y a que deux choses à soucier sur la base de la mise en œuvre de l'organisme de fonction du programme: l'une est la complexité du temps de l'algorithme de conception, et l'autre est la complexité de l'espace (pour le dire franchement, c'est Le temps et la mémoire utilisés pour exécuter un programme et la quantité de mémoire occupée par elle. Les exigences, échangent généralement des ressources d'espace pour le temps ou les objets couramment utilisés résideront généralement dans la mémoire pour améliorer le temps de réponse (la technologie de mise en cache et la plupart des bases de données NOSQL les plus populaires sont utilisées). pour les systèmes intégrés.
Parlons des trois implémentations de la série Febonasi.
Tout d'abord, parlons de la séquence de febonasi:
D'un point de vue textuel, la séquence de Fibonacci commence par 0 et 1, et le coefficient de Fibonacci ultérieur est ajouté par les deux nombres précédents, et la forme de séquence est la suivante:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946 , ………………
En mathématiques, il est défini par des méthodes récursives:
F_0 = 0
F_1 = 1
F_n = f_ {n-1} + f_ {n-2}
Implémentez l'exigence: entrez le numéro de série N et renvoyez pour obtenir le numéro Febonacci correspondant
Implémentation du programme 1 - Fonction auto-itération
La copie de code est la suivante:
/ **
* Fonction d'auto-itération
* @Title: fntype1
* @Description: Todo
* @param @param n
* @param @return
* @return int
* @throws exception
* /
Le public int fntype1 (int n) lève une exception {
if (n == 0) {
retour 0;
} else if (n == 1 || n == 2) {
retour 1;
} else if (n> 2) {
int temp = fntype1 (n-1) + fntype1 (n-2);
if (temp <0) {
Jetez une nouvelle exception ("valeur non valide pour le type int, trop grand");
}autre{
Tempère de retour;
}
}autre{
Jetez une nouvelle exception ("Valeur illégal pour n, veuillez entrer n> = 0");
}
}
Inconvénients de cette méthode: un grand nombre d'itérations consomment en continu l'espace de pile (ceux qui s'engagent dans le développement Web, le débogage et la maintenance doivent connaître la valeur des ressources de pile de serve Pendant longtemps, ce qui entraîne un crash du serveur Web). se produire et le débogage est difficile.
Implémentation du programme 2 - Temps d'espace
La copie de code est la suivante:
/ **
* Il est temps de changer d'espace
* @Title: fntype2
* @Description: Todo
* @param @param n
* @param @return
* @return int (n <0 return -1, au-delà
* @throws
* /
public int fntype2 (int n) {
INT Result = -1;
int temp1 = 0;
int temp2 = 1;
pour (int index = 0; index <= n; index ++) {
if (index == 0) {
résultat = temp1;
} else if (index == 1) {
résultat = temp2;
}autre{
résultat = temp1 + temp2;
if (résultat <0) {
résultat = -2;
casser;
}
temp1 = temp2;
temp2 = résultat;
}
}
Résultat de retour;
}
Cette méthode est principalement utilisée dans: Scénario 1: Pour les scénarios où les objets ou les variables sont utilisés moins souvent et ne seront pas utilisés après une utilisation une fois; .
Implémentation du programme 3 - Espace pour le temps
La copie de code est la suivante:
Liste statique privée <Integer> fndata = new ArrayList <Integer> ();
Final statique privé int maxsize = 50000;
/ **
* Initialiseur
* @Title: setfndata
* @Description: Todo
* @param
* @return void
* @throws
* /
SetFndata statique privé () {
INT Result = -1;
int temp1 = 0;
int temp2 = 1;
pour (int index = 0; index <= maxsize; index ++) {
if (index == 0) {
résultat = temp1;
} else if (index == 1) {
résultat = temp2;
}autre{
résultat = temp1 + temp2;
if (résultat <0) {
résultat = -2;
casser;
}
temp1 = temp2;
temp2 = résultat;
}
fndata.add (résultat);
}
}
/ **
* Interface externe
* @Title: getfndata
* @Description: Todo
* @param @param n
* @param @return
* @return int <span style = "font-Family: Sans-Serif;"> (n Beyond fndata.size () et n <0 return -1) </span>
* @throws
* /
public int getfndata (int n) {
if (fndata.size () == 0) {
setFndata ();
}
if (fndata.size ()> n && n> = 0) {
retour fndata.get (n);
}autre{
retour -1;
}
}
Cette méthode est généralement utilisée dans des scénarios où des objets ou des variables existent ou sont fréquemment appelés tout au long du cycle de vie du programme, tels que l'appel de l'interface de service Web externe, la couche de persistance d'abstraction, le chargement de paramètres de fichier de configuration couramment utilisé, etc.
Cas de test:
La copie de code est la suivante:
package com.dbc.yangg.swing.test;
import java.util.arraylist;
Importer java.util.list;
/ **
* Entrez le numéro de séquence n et retournez pour obtenir le numéro Febonacci correspondant
* @Classname: init
* @Description: Todo
* @author [email protected]
* @Date 10 janvier 2014 à 19:52:13
*
* /
classe publique init {
/ **
* Fonction d'auto-itération
* @Title: fntype1
* @Description: Todo
* @param @param n
* @param @return
* @return int
* @throws exception
* /
Le public int fntype1 (int n) lève une exception {
if (n == 0) {
retour 0;
} else if (n == 1 || n == 2) {
retour 1;
} else if (n> 2) {
int temp = fntype1 (n-1) + fntype1 (n-2);
if (temp <0) {
Jetez une nouvelle exception ("valeur non valide pour le type int, trop grand");
}autre{
Tempère de retour;
}
}autre{
Jetez une nouvelle exception ("Valeur illégal pour n, veuillez entrer n> = 0");
}
}
/ **
* Il est temps de changer d'espace
* @Title: fntype2
* @Description: Todo
* @param @param n
* @param @return
* @return int (n <0 return -1, au-delà
* @throws
* /
public int fntype2 (int n) {
INT Result = -1;
int temp1 = 0;
int temp2 = 1;
pour (int index = 0; index <= n; index ++) {
if (index == 0) {
résultat = temp1;
} else if (index == 1) {
résultat = temp2;
}autre{
résultat = temp1 + temp2;
if (résultat <0) {
résultat = -2;
casser;
}
temp1 = temp2;
temp2 = résultat;
}
}
Résultat de retour;
}
Liste statique privée <Integer> fndata = new ArrayList <Integer> ();
Final statique privé int maxsize = 50000;
/ **
* Espace pour changer le temps
* @Title: setfndata
* @Description: Todo
* @param
* @return void
* @throws
* /
SetFndata statique privé () {
INT Result = -1;
int temp1 = 0;
int temp2 = 1;
pour (int index = 0; index <= maxsize; index ++) {
if (index == 0) {
résultat = temp1;
} else if (index == 1) {
résultat = temp2;
}autre{
résultat = temp1 + temp2;
if (résultat <0) {
résultat = -2;
casser;
}
temp1 = temp2;
temp2 = résultat;
}
fndata.add (résultat);
}
}
/ **
*
* @Title: getfndata
* @Description: Todo
* @param @param n
* @param @return
* @return int (n Beyond fndata.size () et n <0 return -1)
* @throws
* /
public int getfndata (int n) {
if (fndata.size () == 0) {
setFndata ();
}
if (fndata.size ()> n && n> = 0) {
retour fndata.get (n);
}autre{
retour -1;
}
}
/ **
*
* @Title: Main
* @Description: Todo
* @param @param argv
* @return void
* @throws
* /
public static void main (String [] argv) {
Init init = new init ();
int n = 46;
essayer {
System.out.println ("type1 =" + init.fntype1 (n));
} catch (exception e) {
// Bloc de capture généré automatiquement de TODO
System.out.println (e.getMessage ());
}
System.out.println ("type2 =" + init.fntype2 (n));
System.out.println ("type3 =" + init.getfndata (n));
}
}
Résultat de sortie:
La copie de code est la suivante:
Type1 = 1836311903
Type2 = 1836311903
Type3 = 1836311903
Lors de la conception d'algorithmes, ne suivez pas aveuglément les concepts.
Permettez-moi de me plaindre: je crois personnellement qu'une excellente conception de la structure des données peut simplifier la complexité de la conception des algorithmes et améliorer la lisibilité du code, l'évolutivité du programme et l'efficacité de l'exécution;
Permettez-moi de se plaindre à nouveau: trois principes doivent être suivis lors de l'analyse de la demande: 1. L'analyse du point de vue de l'utilisateur et de la façon de penser; Les principes du développement du programme sont les suivants: améliorer activement son propre goût et analyser les fonctions du point de vue de l'utilisation de l'utilisateur et des scénarios d'utilisation; IS et quelle situation utilise l'utilisateur suivant, quelles exceptions peuvent être causées par les paramètres de passage, quelles exceptions peuvent se produire dans la mise en œuvre de votre interface et capturent les exceptions possibles, la sortie claire, la bonne fonction Autisme; Ensuite, vous sur la base de la mise en œuvre de l'entreprise, vous devez concevoir l'interface utilisateur en tant qu'utilisateur en termes d'habitudes d'utilisation des utilisateurs et d'autres aspects. C'est très intéressant, non?