Hablemos de por qué escribí esto primero. Cuando fui a la entrevista, fui a la ciudad de la entrevista designada de Alibaba a las 11 en punto del día antes de la entrevista, y encontré un hotel y me quedé alrededor de la 1 en punto. , lo que llevó directamente a los pobres resultados de la entrevista al día siguiente (para esos grandes camarones que buscan trabajo no debería decir una tragedia a los camarones. Todavía es muy importante prepararse por adelantado). Una hora (cuando regresé de la entrevista, estaba casi dormido cuando caminé, ¡triste!) Cuando la entrevista estaba a punto de terminar, el entrevistador me hizo la pregunta sobre la secuencia de Fibonacci. Y solo sabía que tenía que establecer tres variables o inicializarlas con la lista. End, solo puedo escribir el siguiente primer método bajo la inducción paso a paso del entrevistador. Período de oro para la reforma y la minería de oro (puede ir rápidamente si tiene la capacidad). Con la basura, para el análisis de datos, Alibaba puede analizar los diversos datos detallados del usuario que ha dominado, y puede localizar mejor los gustos y necesidades de los usuarios, proporcionando mejor un impulso preciso y una publicidad precisa. Si el futuro sueño de Tencent es ser el agua, la electricidad y el gas en la vida de los usuarios, entonces el posible sueño futuro de Alibaba es la comida, la ropa, la alojamiento y el transporte del usuario, y la recolección de agua, electricidad y gas, etc. O (∩_∩) O ~ Vamos al tema.
Para excelentes diseñadores de algoritmos, solo hay dos cosas por las que preocuparse sobre la base de la implementación del cuerpo de la función del programa: uno es la complejidad del tiempo del algoritmo de diseño, y la otra es la complejidad del espacio (para decirlo sin rodeos, es El tiempo y la memoria utilizada para ejecutar un programa y la cantidad de memoria ocupada por él. Los requisitos, generalmente de intercambio de recursos de espacio para el tiempo o los objetos de uso común, generalmente residirán en la memoria para mejorar el tiempo de respuesta (la tecnología de almacenamiento en caché y la mayoría de las bases de datos NoSQL más populares se utilizan). para sistemas integrados.
Hablemos sobre las tres implementaciones de la serie FeBonoSi.
Primero, hablemos de la secuencia de FeBonoSi:
Desde un punto de vista textual, la secuencia Fibonacci comienza con 0 y 1, y el coeficiente de Fibonacci posterior es agregado por los dos números anteriores, y la forma de secuencia es la siguiente:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946 , ………………
En matemáticas, se define por métodos recursivos:
F_0 = 0
F_1 = 1
F_n = f_ {n-1}+ f_ {n-2}
Implementar el requisito: ingrese el número de serie n y regrese para obtener el número de FeBonacci correspondiente
Implementación del programa 1 - autoiteración de función
La copia del código es la siguiente:
/**
* Funcionar autoiteración
* @Title: fntype1
* @Description: TODO
* @param @param n
* @param @return
* @return int
* @@throws Exception
*/
public int fntype1 (int n) lanza la excepción {
if (n == 0) {
regresar 0;
} else if (n == 1 || n == 2) {
regresar 1;
} else if (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
if (temp <0) {
arrojar una nueva excepción ("Valor no válido para el tipo int, demasiado grande");
}demás{
regresar temp;
}
}demás{
arrojar una nueva excepción ("Valor ilegalargument para n, ingrese n> = 0");
}
}
Desventajas de este método: una gran cantidad de iteraciones consumen continuamente el espacio de la pila (aquellos que participan en el desarrollo web, la depuración y el mantenimiento deben conocer el valor de los recursos de la pila del servidor. Si una gran cantidad de iteraciones de llamadas concurrentes hacen que los recursos de la pila del servidor se reciclen Durante mucho tiempo, lo que resulta en el bloqueo del servidor web). ocurrir y la depuración es difícil.
Implementación del programa 2: hora de espacio
La copia del código es la siguiente:
/**
* Hora de cambiar de espacio
* @Title: fntype2
* @Description: TODO
* @param @param n
* @param @return
* @return int (n <0 return -1, más allá de max int size return -2)
* @throws
*/
public int fntype2 (int n) {
int resultado = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= n; index ++) {
if (index == 0) {
resultado = temp1;
} else if (index == 1) {
resultado = temp2;
}demás{
resultado = temp1+temp2;
if (resultado <0) {
resultado = -2;
romper;
}
temp1 = temp2;
temp2 = resultado;
}
}
resultado de retorno;
}
Este método se usa principalmente en: Escenario 1: para escenarios donde los objetos o variables se usan con menos frecuencia y no se utilizarán nuevamente después de su uso una vez; .
Implementación del programa 3 - Espacio para el tiempo
La copia del código es la siguiente:
Lista estática privada <integer> fndata = new ArrayList <Integer> ();
Private estático final int maxSize = 50000;
/**
* Inicializador
* @Title: setfndata
* @Description: TODO
* @param
* @return void
* @throws
*/
privado void static setfndata () {
int resultado = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= maxsize; index ++) {
if (index == 0) {
resultado = temp1;
} else if (index == 1) {
resultado = temp2;
}demás{
resultado = temp1+temp2;
if (resultado <0) {
resultado = -2;
romper;
}
temp1 = temp2;
temp2 = resultado;
}
fndata.add (resultado);
}
}
/**
* Interfaz externa
* @Title: getfndata
* @Description: TODO
* @param @param n
* @param @return
* @return int <span style = "Font-Family: sans-serif;"> (n beyond fndata.size () y n <0 return -1) </span>
* @throws
*/
public int getfndata (int n) {
if (fndata.size () == 0) {
setfndata ();
}
if (fndata.size ()> n && n> = 0) {
return fndata.get (n);
}demás{
regreso -1;
}
}
Este método generalmente se usa en escenarios en los que los objetos o variables existen o se llaman con frecuencia durante todo el ciclo de vida del programa, como llamar a la interfaz de servicio web externo, la capa de persistencia de abstracción, la carga de parámetros del archivo de configuración de uso común, etc.
Casos de prueba:
La copia del código es la siguiente:
paquete com.dbc.yangg.swing.test;
import java.util.arrayList;
import java.util.list;
/**
* Ingrese el número de secuencia n y regrese para obtener el número de FeBonacci correspondiente
* @Classname: init
* @Description: TODO
* @author [email protected]
* @Date 10 de enero de 2014 a las 7:52:13 PM
*
*/
clase pública init {
/**
* Funcionar autoiteración
* @Title: fntype1
* @Description: TODO
* @param @param n
* @param @return
* @return int
* @@throws Exception
*/
public int fntype1 (int n) lanza la excepción {
if (n == 0) {
regresar 0;
} else if (n == 1 || n == 2) {
regresar 1;
} else if (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
if (temp <0) {
arrojar una nueva excepción ("Valor no válido para el tipo int, demasiado grande");
}demás{
regresar temp;
}
}demás{
arrojar una nueva excepción ("Valor ilegalargument para n, ingrese n> = 0");
}
}
/**
* Hora de cambiar de espacio
* @Title: fntype2
* @Description: TODO
* @param @param n
* @param @return
* @return int (n <0 return -1, más allá de max int size return -2)
* @throws
*/
public int fntype2 (int n) {
int resultado = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= n; index ++) {
if (index == 0) {
resultado = temp1;
} else if (index == 1) {
resultado = temp2;
}demás{
resultado = temp1+temp2;
if (resultado <0) {
resultado = -2;
romper;
}
temp1 = temp2;
temp2 = resultado;
}
}
resultado de retorno;
}
Lista estática privada <integer> fndata = new ArrayList <Integer> ();
Private estático final int maxSize = 50000;
/**
* Espacio para cambiar el tiempo
* @Title: setfndata
* @Description: TODO
* @param
* @return void
* @throws
*/
privado void static setfndata () {
int resultado = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= maxsize; index ++) {
if (index == 0) {
resultado = temp1;
} else if (index == 1) {
resultado = temp2;
}demás{
resultado = temp1+temp2;
if (resultado <0) {
resultado = -2;
romper;
}
temp1 = temp2;
temp2 = resultado;
}
fndata.add (resultado);
}
}
/**
*
* @Title: getfndata
* @Description: TODO
* @param @param n
* @param @return
* @return int (n beyond fndata.size () y n <0 return -1)
* @throws
*/
public int getfndata (int n) {
if (fndata.size () == 0) {
setfndata ();
}
if (fndata.size ()> n && n> = 0) {
return fndata.get (n);
}demás{
regreso -1;
}
}
/**
*
* @Title: principal
* @Description: TODO
* @param @param argv
* @return void
* @throws
*/
public static void main (string [] argv) {
Init init = new Init ();
int n = 46;
intentar {
System.out.println ("type1 ="+init.fntype1 (n));
} Catch (Exception e) {
// bloque de captura generado automático
System.out.println (e.getMessage ());
}
System.out.println ("type2 ="+init.fntype2 (n));
System.out.println ("type3 ="+init.getfndata (n));
}
}
Resultado de salida:
La copia del código es la siguiente:
Tipo1 = 1836311903
Tipo2 = 1836311903
Tipo3 = 1836311903
Al diseñar algoritmos, no siga ciegamente los conceptos.
Permítanme quejarme: personalmente creo que un excelente diseño de estructura de datos puede simplificar la complejidad del diseño de algoritmos y mejorar la legibilidad del código, la escalabilidad del programa y la eficiencia de ejecución;
Permítanme quejarme nuevamente: se deben seguir tres principios al hacer análisis de la demanda: 1. Análisis desde la perspectiva del usuario y la forma de pensar. Los principios del desarrollo del programa son: mejorar activamente el propio sabor y analizar las funciones desde la perspectiva de uso del usuario y los escenarios de uso; es y qué situación se llamará al usuario a continuación, qué excepciones pueden ser causadas por los parámetros de aprobación, qué excepciones pueden ocurrir en la implementación de su interfaz y capturar posibles excepciones, salida clara, buen autismo; Luego, usted sobre la base de garantizar la implementación comercial, debe diseñar la interfaz de usuario como usuario en términos de hábitos de uso del usuario y otros aspectos. Es muy interesante, ¿verdad?