Entrevista 2020-Byte-Frontend

1. Primero, introduzca algunos idiomas que conozca, principalmente el backend.

2. ¿Entiende el dominio cruzado?

Dominio: la composición de la URL de un sitio web incluye el nombre del protocolo, el nombre del subdominio, el nombre del dominio principal y el número de puerto. Por ejemplo, https://www.github.com/80 . Donde https es el nombre del protocolo, www.github.com es el nombre del subdominio, github.com es el nombre del dominio principal y el número de puerto es 80. Al solicitar datos de una URL en la página, si el nombre del protocolo, el nombre del subdominio y el Si alguno de los nombres de dominio y número de puerto es diferente, surgirán problemas entre dominios. Incluso si  solicita http://127.0.0.1:80/ en la página  http: // localhost: 80 / habrá problemas entre dominios (porque los nombres de dominio son diferentes). Todos los dominios aquí se refieren a la colección de protocolo \ nombre de dominio \ número de puerto, y el mismo dominio significa que el nombre de dominio del protocolo y el número de puerto son los mismos

El problema entre dominios es que los navegadores están restringidos por la política del mismo origen. Los js del nombre de dominio actual solo pueden leer las propiedades de la ventana en el mismo dominio. 

Estrategia del mismo origen: en el proceso de desarrollo de front-end, las etiquetas HTML comunes, como las operaciones <a/>,<form/>,<img/>,<script/>,<iframe/>y ajax, pueden apuntar a una dirección de recurso o pueden iniciar una solicitud de un recurso, luego las solicitudes mencionadas aquí incluyen solicitudes del mismo dominio y solicitudes entre dominios. La estrategia del mismo origen es la estrategia de seguridad básica central del navegador, que se utiliza para defenderse de los ataques ilegales, pero no podemos bloquear todos los problemas entre dominios solo porque queremos defendernos de los ataques ilegales.

Solicitud entre dominios: cuando el dominio de la solicitud es inconsistente con el dominio al que apunta el recurso solicitado

  • En el desarrollo front-end, a menudo se utilizan interfaces de servicios de terceros (como servidor simulado, API falsa). Con la aparición de la división del trabajo especializada, hay muchos proveedores de servicios de información profesionales que proporcionan varias interfaces para los desarrolladores front-end. En este caso, se requieren solicitudes entre dominios (la mayoría de ellas se resuelven mediante cruces)
  • El front-end y el back-end pertenecen a servicios diferentes. Cuando se adopta la arquitectura de separación de front-end y back-end, hay problemas entre dominios (la mayoría de ellos se resuelven mediante métodos de proxy inverso)

Solución:

  • El más simple y común: use jsonp, es decir, json con relleno, que, como su nombre lo indica, es llenar JSON en un cuadro
  • De una vez por todas: configure directamente CORS (Intercambio de recursos de origen cruzado) de acceso a recursos de origen cruzado en el lado del servidor, establezca Access-Control-Allow-Origin en el encabezado del encabezado de solicitud para especificar el nombre de dominio que puede obtener datos
  • Sencillo y eficaz: solicita directamente una imagen
  • Buscar "papá": cruza subdominios modificando document.domain
  • Buenos hermanos: reciba datos en todos los dominios a través de window.name
  • Edad Neolítica: Dominio cruzado utilizando el método HTML5 window.postMessage

3. ¿Cuénteme sobre el mecanismo de almacenamiento en caché http?

Caché web: se puede dividir aproximadamente en: caché de base de datos, caché del lado del servidor (caché del servidor proxy, caché CDN), caché del navegador. El caché del navegador contiene una gran cantidad de contenido: caché HTTP, indexDB, cookies, almacenamiento local, etc.

Mensaje HTTP: el bloque de datos enviado y respondido cuando el navegador y el servidor se comunican. 
El navegador solicita datos del servidor y envía un mensaje de solicitud (solicitud); el servidor devuelve datos al navegador y devuelve un mensaje de respuesta (respuesta). 
La información de los mensajes se divide principalmente en dos partes 

  1. El encabezado que contiene los atributos ————————– La información adicional (cookies, información de caché, etc.) y la información de las reglas relacionadas con el caché se incluyen en el encabezado 
  2. Contiene el cuerpo de los datos ——————— La parte de la solicitud HTTP que realmente quiere ser transmitida

Propiedades en los encabezados de respuesta:

  • Etag (prioridad más alta que Last-Modified / If-Modified-Since): cuando el servidor responde a la solicitud, le dice al navegador el identificador único del recurso actual en el servidor (la regla de generación la determina el servidor).
  • Última modificación: cuando el servidor responde a la solicitud, le dice al navegador la última hora de modificación del recurso.
  • If-Modified-Since: Al solicitar el servidor nuevamente, use este campo para notificar al servidor de la última hora de modificación del recurso devuelto por el servidor durante la última solicitud. Una vez que el servidor recibe la solicitud, busca el encabezado If-Modified-Since y lo compara con la última hora de modificación del recurso solicitado. Si el tiempo de última modificación del recurso es mayor que If-Modified-Since, lo que indica que el recurso ha sido modificado, responderá a todo el contenido del recurso y devolverá un código de estado de 200; si el tiempo de última modificación del recurso es menor o igual a If-Modified-Since, el recurso no tiene La nueva modificación responderá a HTTP 304, indicando al navegador que continúe usando la caché guardada.
  • If-None-Match: Cuando vuelva a solicitar el servidor, use este campo para notificar al servidor el identificador único de los datos almacenados en caché por el segmento de clientes. Una vez que el servidor recibe la solicitud, si encuentra el encabezado If-None-Match, se comparará con el identificador único del recurso solicitado. Si es diferente, indicando que el recurso ha sido cambiado, responderá a todo el contenido del recurso y devolverá un código de estado de 200; el mismo, indicando el recurso Si no hay una nueva modificación, responde con HTTP 304 para informar al navegador que continúe usando la caché guardada.
  • Caduca: es HTTP 1.0. Ahora los navegadores predeterminados usan HTTP 1.1 por defecto, por lo que su función es básicamente ignorada. 
  • Control de caché: De acuerdo con Expires, ambos indican el período de validez del recurso actual y controlan si el navegador obtiene datos directamente de la caché del navegador o vuelve a enviar una solicitud al servidor para obtener datos. Es solo que Cache-Control tiene más opciones y configuraciones más detalladas.Si se configura al mismo tiempo, su prioridad es mayor que Expires. Hay seis valores:
Control de caché Es la regla más importante. Los valores comunes son private, public, no-cache, max-age, no-store y el predeterminado es private.
privado El cliente puede almacenar en caché
público Tanto el cliente como el servidor proxy se pueden almacenar en caché (los estudiantes de front-end pueden pensar que lo público y lo privado son lo mismo)
edad máxima = xxx El contenido en caché caducará en xxx segundos.
no-cache Necesita usar la caché de contraste para verificar los datos almacenados en caché (se describe más adelante)
sin tienda:           Todo el contenido no se almacenará en caché, el caché forzado y el caché de contraste no se activará (para el desarrollo de front-end, cuanto más caché, mejor, así que ... básicamente dígale 886)   

Almacenamiento en caché obligatorio: el servidor informa al navegador de un tiempo de almacenamiento en caché. Durante el tiempo de almacenamiento en caché, la siguiente solicitud utilizará el caché directamente y la estrategia de comparación de almacenamiento en caché se ejecutará si se agota el tiempo.  Comparación de caché: envíe la información de Etag y Last-Modified en la caché al servidor a través de una solicitud, y el servidor la verificará. Cuando se devuelve un código de estado 304, el navegador utiliza directamente la caché.

4. ¿Introducir algunos modelos IO?

IO de bloqueo, IO sin bloqueo, IO multiplexado, IO controlado por señal y IO asíncrono.

  1. Bloqueo de E / S: el modelo de E / S más tradicional, es decir, el bloqueo se produce en el proceso de lectura y escritura de datos. Después de que el hilo del usuario emite una solicitud de E / S, el kernel del sistema operativo verificará si los datos están listos, si no está listo, esperará a que los datos estén listos y el hilo del usuario estará en un estado bloqueado y el hilo del usuario entregará la CPU. Cuando los datos están listos, el núcleo copia los datos en el hilo del usuario y devuelve el resultado al hilo del usuario, y el hilo del usuario libera el estado de bloqueo.
  2. E / S sin bloqueo: cuando un hilo de usuario inicia una operación de lectura, no necesita esperar, pero obtiene un resultado de inmediato. Si el resultado es un error, sabe que los datos no están listos, por lo que puede enviar nuevamente la operación de lectura. Una vez que los datos en el kernel están listos y recibe una solicitud del hilo del usuario nuevamente, inmediatamente copia los datos al hilo del usuario y luego regresa. Entonces, de hecho, en el modelo de E / S sin bloqueo, el hilo del usuario debe preguntar constantemente si los datos del kernel están listos, es decir, la E / S sin bloqueo no entregará la CPU, pero siempre ocupará la CPU. Pero para IO sin bloqueo, existe un problema muy serio. En el bucle while, es necesario sondear constantemente si los datos del kernel están listos, lo que conducirá a un uso de CPU muy alto. Por lo tanto, el bucle while rara vez se usa en general. Lee los datos.
    //伪代码
    while(true){
    new MyThread(socket)
    }
    class MyThread{
    data = socket.read();
    if(data!= error){
    //处理数据
    break;
    }
    
  3. E / S multiplexadas: El modelo de E / S multiplexadas es actualmente el modelo más utilizado. En el modelo de IO multiplexado, habrá un hilo que sondea constantemente el estado de varios sockets, y solo cuando el socket realmente tiene eventos de lectura y escritura, se llaman realmente las operaciones de lectura y escritura de IO reales. Porque en el modelo IO multiplexado, solo se puede usar un subproceso para administrar múltiples sockets . El sistema no necesita crear nuevos procesos o subprocesos, ni necesita mantener estos subprocesos y procesos, y solo cuando hay eventos de lectura y escritura de socket. Los recursos de IO se utilizarán solo cuando sea el momento, por lo que reduce en gran medida la ocupación de recursos. En Java NIO, el selector.select () se utiliza para consultar si cada canal tiene un evento de llegada, si no hay evento siempre estará bloqueado allí, por lo que este método provocará el bloqueo del hilo del usuario. Quizás algunos amigos dirán que puedo usar multihilo + bloqueo de E / S para lograr efectos similares, pero debido a que en multihilo + bloqueo de E / S, cada socket corresponde a un hilo, lo que causará una gran ocupación de recursos, y especialmente durante mucho tiempo. En términos de conexiones, los recursos de subprocesos nunca se liberarán. Si hay muchas conexiones más adelante, se producirá un cuello de botella en el rendimiento. En el modo IO multiplexado, se pueden administrar varios sockets a través de un subproceso, y solo cuando el socket realmente tenga un evento de lectura y escritura, consumirá recursos para realizar las operaciones de lectura y escritura reales. Por lo tanto, la E / S multiplexada es más adecuada para situaciones con un gran número de conexiones. Además, la razón por la que la E / S multiplexada es más eficiente que el modelo de E / S sin bloqueo se debe a que en la E / S sin bloqueo, el estado del conector se pregunta constantemente a través del hilo del usuario, mientras que en la E / S multiplexada, se consulta cada conector. El estado lo realiza el kernel y esta eficiencia es mucho mayor que la de los subprocesos de usuario. Sin embargo, debe tenerse en cuenta que el modelo IO multiplexado utiliza el sondeo para detectar si llega un evento y responde a los eventos que llegan uno por uno. Por lo tanto, para el modelo IO multiplexado, una vez que el cuerpo de respuesta al evento sea grande, los eventos posteriores no se procesarán tarde y afectarán el sondeo de nuevos eventos.
  4. E / S impulsada por señales: cuando un hilo de usuario inicia una operación de solicitud de E / S, registrará una función de señal en el conector correspondiente, y luego el hilo del usuario continuará ejecutándose.Cuando los datos del kernel estén listos, se enviará una señal al hilo del usuario. Después de que el hilo del usuario reciba la señal, Llame a las operaciones de lectura y escritura de IO en la función de señal para realizar la operación de solicitud de IO real.
  5. E / S asíncrona: Es el modelo de E / S más ideal. En el modelo de E / S asíncrona, cuando un hilo de usuario inicia una operación de lectura, puede comenzar a hacer otras cosas inmediatamente. Por otro lado, desde la perspectiva del kernel, cuando recibe una lectura asincrónica, regresará inmediatamente, indicando que la solicitud de lectura se ha iniciado con éxito, por lo que no se generará ningún bloque para el hilo del usuario. Luego, el kernel esperará a que se complete la preparación de los datos y luego copiará los datos en el hilo del usuario.Cuando todo esto esté completo, el kernel enviará una señal al hilo del usuario para indicarle que la operación de lectura se ha completado. En otras palabras, el hilo del usuario no necesita cómo se realiza toda la operación de IO. Solo necesita iniciar una solicitud. Cuando se recibe la señal de éxito devuelta por el kernel, la operación de IO se ha completado y los datos se pueden usar directamente. En otras palabras, en el modelo IO asíncrono, las dos fases de la operación IO no bloquearán el hilo del usuario. Ambas fases son completadas automáticamente por el kernel y luego se envía una señal para informar al hilo del usuario que la operación se ha completado. No es necesario volver a llamar a la función IO para lectura y escritura específicas en el hilo del usuario. Este punto es diferente del modelo impulsado por señales. En el modelo impulsado por señales, cuando el subproceso del usuario recibe una señal, indica que los datos están listos, y luego el subproceso del usuario necesita llamar a la función IO para las operaciones reales de lectura y escritura; mientras que en el modelo IO asíncrono, La señal indica que la operación IO se ha completado y no es necesario llamar a la función iO en el hilo del usuario para las operaciones reales de lectura y escritura. Tenga en cuenta que la E / S asincrónica requiere el soporte subyacente del sistema operativo, ya que ya sea una E / S multiplexada o un modelo controlado por señales, la segunda etapa de la operación de E / S hará que el hilo del usuario se bloquee, es decir, el proceso de copia de datos por parte del kernel permitirá que el hilo del usuario bloquear.

5. ¿Conoce el modelo de nodo?

Node.js utiliza E / S asíncronas y controladas por eventos para implementar un entorno de ejecución de JavaScript de un solo subproceso y alta concurrencia.

6. ¿Conoce mysql? ¿Conoce el índice SQL? Hay una gran cantidad de datos en la base de datos.

Razones de la eficiencia de las consultas lentas:

1: Sin índice o falla de índice

La condición where utiliza la siguiente declaración para invalidar el índice: null ,! =, <>, o conexión, en (debe usarse, se puede reemplazar por la palabra clave existe) y no en, '% abc%';

Usar parámetros: num = @ num, operación de expresión: donde num / 2 = 100, operación de función: donde subcadena (nombre, 1, 3) = 'abc'-nombre;

2: la cantidad de datos consultados es demasiado grande y se devuelven filas y columnas innecesarias

Solo consulte campos útiles, no use * para consultar todos los campos. Reemplace "*" con una lista de campos específica y no devuelva ningún campo que no se utilice.

Utilice varios subprocesos para varias consultas. Si la condición de la consulta es una condición de rango, como un cierto período de tiempo, puede dividir la condición de tiempo y combinar varios resultados de la consulta.

3: bloqueo o interbloqueo

4: El rendimiento de E / S es pequeño, lo que genera un efecto de cuello de botella.

5: Memoria insuficiente.

Cree menos objetos. Los objetos solo se crean cuando es necesario usarlos y no pasan por todo el contexto.

Limpia la memoria jvm a tiempo.

6: La velocidad de la red es lenta. 

Método de optimización de SQL

1: Si el índice es un índice compuesto, el primer campo del índice debe usarse como condición para garantizar que el sistema use el índice; de ​​lo contrario, no se hará referencia al índice y el orden de los campos debe ser lo más consistente posible con el orden del índice.

2: Los índices no son tantos como sea posible. Un índice de tabla es mejor no exceder 6. Aunque el índice puede mejorar la eficiencia de la selección, también reduce la eficiencia de la inserción y la actualización, ya que la inserción y la actualización reconstruirán el índice, por lo que se debe considerar cuidadosamente cómo construir el índice.

3: Algunas optimizaciones de la construcción de tablas:

Intente utilizar campos numéricos. Si los datos contienen solo información numérica, intente no diseñarlos como un tipo de carácter. Esto reducirá el rendimiento de la consulta y la conexión y aumentará la sobrecarga de almacenamiento. Debido a que el motor compara cada carácter de la cadena uno por uno al procesar consultas y conexiones, y para los tipos numéricos, solo una comparación es suficiente.
Intente utilizar varchar / nvarchar en lugar de char / nchar, porque primero, los campos de longitud variable tienen un espacio de almacenamiento pequeño y pueden ahorrar espacio de almacenamiento.En segundo lugar, para las consultas, la eficiencia de búsqueda en un campo relativamente pequeño es obviamente mayor.
4: Trate de evitar el uso del cursor, porque la eficiencia del cursor es pobre, si los datos operados por el cursor exceden las 10,000 filas, entonces debería considerar reescribir. (El cursor es una función muy antigua, casi obsoleta).

5: No todos los índices son efectivos para las consultas. SQL se optimiza en función de los datos de la tabla. Cuando se repite una gran cantidad de datos en la columna del índice, es posible que la consulta SQL no utilice el índice. Por ejemplo, hay campos sexo, hombre y Las mujeres son casi la mitad, por lo que incluso si un índice se basa en el sexo, no influirá en la eficiencia de las consultas.

6: Intente evitar grandes operaciones de transacciones y mejore la simultaneidad del sistema.

Precauciones:

1: Cuando use Me gusta, asegúrese de recordar dejar en blanco

... donde nombre como '%'. nombre de variable. '%'; (el valor de la variable se pasa desde fuera)

Si: la variable está vacía, se convierte en el siguiente sql

... donde un nombre como '%%'; - La consecuencia de esta condición es 'seleccionar todos los datos o actualizar todos los datos o eliminar todos los datos', lo que equivale a ninguna condición de escritura, que es un problema grave después de que ocurre.

2: como con comodines: el uso de% y _

La clasificación de
comodines: %% comodín: indica que cualquier carácter aparece cualquier número de veces ** (puede ser 0) **.
_Underscore comodín: solo puede coincidir con un solo carácter, ni más ni menos, solo un carácter.

Operador Like: La
función de LIKE es indicar que el patrón de búsqueda detrás de mysql es usar comodines en lugar de coincidencias iguales directas para la comparación.
Nota: Si usa el operador like, el efecto de este último sin usar el operador de coincidencia general es consistente con =, SELECT * FROM productos DONDE products.prod_name como '1000'; El único resultado coincidente es 1000, pero no puede coincidir con el resultado como JetPack 1000.

1)% de uso de comodines:
coincide con los registros que comienzan con "yves": (incluido el registro "yves")
SELECCIONAR * DE productos DONDE productos.prod_name como'yves% ';

Coincidir registros que contienen "yves" (incluido el registro "yves")
SELECCIONAR * FROM productos DONDE productos.prod_name como '% yves%';

Haga coincidir los registros que terminan con "yves" (incluido el registro "yves", excluyendo el registro "yves", es decir, los registros con espacios después de yves, que necesitan atención aquí)
SELECCIONE * FROM productos DONDE productos.prod_name como '% yves';

2) Uso de caracteres comodín:
SELECT * FROM products WHERE products.prod_name like'_yves '; El
resultado coincidente es: registro como "yyves".

SELECCIONE * FROM productos DONDE productos.prod_name like'yves__ '; El
resultado coincidente es: registros como "yvesHe". (Un guión bajo solo puede coincidir con un carácter, ni más ni menos)

Otras operaciones:

 insertar en tb (...) valores (...), (...) ...; es mejor que insertar en tb (...) valores (...); insertar en tb (...) valores (...); ... El método de inserción por lotes es altamente eficiente [razón]: La razón principal de la alta eficiencia de la segunda ejecución de SQL aquí es el volumen de registro después de la fusión (las transacciones binlog e innodb de MySQL hacen que el registro) se reduzca, reduciendo el registro La cantidad y frecuencia del cepillado de datos, mejorando así la eficiencia. Al fusionar sentencias SQL, también puede reducir el número de análisis de sentencias SQL y reducir la E / S de transmisión de red.

7. ¿Entiende los procesos y los hilos? ¿Cuál es la unidad básica de procesamiento de la CPU?

El proceso es la unidad básica de asignación de recursos del sistema operativo, y el hilo es la unidad básica de programación y ejecución de tareas. El proceso es un contenedor de hilos

8. ¿Cuénteme sobre el algoritmo de procesamiento de la CPU?

9. ¿Qué es el bloqueo del proceso?

Definición de punto muerto: El punto muerto es el fenómeno de que varios procesos en un conjunto de procesos se esperan entre sí debido a la competencia por los recursos. Por ejemplo: A y B comen bolas de masa, A tiene salsa de soja, B tiene vinagre, A quiere vinagre y B quiere salsa de soja. Como resultado, ambos esperan para comer bolas de masa.

Causas del punto muerto: recursos del sistema insuficientes; secuencia de avance irrazonable de múltiples procesos; asignación incorrecta de recursos

Condiciones necesarias para el interbloqueo:

(1) Exclusión mutua: los recursos no se pueden compartir y solo pueden ser utilizados por un proceso.

(2) Solicitar y retener condiciones (Retener y esperar): Los procesos que ya han obtenido recursos pueden solicitar nuevos recursos nuevamente.

(3) No preferencia: Los recursos asignados no pueden ser privados a la fuerza del proceso correspondiente.

(4) Condición de espera circular (espera circular): varios procesos en el sistema forman un bucle, y cada proceso en el bucle está esperando que los recursos estén ocupados por procesos adyacentes.

Hay cuatro formas de lidiar con el punto muerto: 1) Prevenir el punto muerto 2) Evitar el punto muerto 3) Detectar y eliminar el punto muerto

Prevenir el punto muerto: destruye una de las cuatro condiciones necesarias

① Destrucción de las condiciones de exclusión mutua: Permitir que los recursos se compartan, por ejemplo, la tecnología SPOOLing puede permitir que varios procesos generen datos de impresión al mismo tiempo.

Desventajas: La tecnología SPOOLing no es adecuada para todos los recursos, como tablas de procesos, etc., por lo que es más difícil destruir la exclusión mutua de recursos, este método no es muy bueno

② Solicitud de destrucción y condiciones de retención: los recursos se asignan a la vez.

Desventajas: Con este mecanismo, el proceso ya no se aplica a los recursos durante el proceso de ejecución, pero la eficiencia de este método es extremadamente baja y los recursos no se pueden utilizar por completo.

③Romper la condición inalienable: existen dos métodos, uno es ceder los recursos originalmente ocupados cuando no se cumplen los recursos solicitados; el otro método solo es aplicable al proceso de solicitud de recursos con mayor prioridad Cuando la prioridad de proceso del recurso es alta, si el recurso solicitado por un proceso está ocupado por otros procesos y la prioridad del proceso de solicitud es mayor, entonces puede obligar al proceso que ocupa el recurso a ceder. Este método es generalmente aplicable a procesadores y recursos de almacenamiento.

④ Condición de espera del ciclo de destrucción: el sistema asigna un número a cada tipo de recurso, y cada proceso solicita el recurso en orden de número creciente, y la liberación es lo opuesto (como el problema de la comida del filósofo)

Hay dos formas de evitar el estancamiento: 1) Los recursos se asignan en orden y 2) El algoritmo bancario.

Hay dos formas de eliminar el punto muerto: 1) método de privación de recursos 2) método de deshacer el proceso 3) método de deshacer el proceso

10. Darle la URL de un sitio web, por favor escriba todas las URL en esta URL y todas las URL redirigidas después de pasar estas URL que no son resultados repetidos.

11. ¿Cuál es la diferencia entre el tipo de contenido de cargar un archivo y hacer clic en un botón? ¿Cuál es la diferencia entre el protocolo de transmisión http?

tipo de contenido:

Generalmente se refiere al tipo de contenido que existe en la página web, que se utiliza para definir el tipo de archivo de red y la codificación de la página web, y determinar qué forma y codificación el navegador leerá este archivo. Este es el resultado de ver con frecuencia algunos clics en páginas web PHP. Es el motivo de la descarga de un archivo o una imagen. El encabezado le dice al cliente el tipo de contenido del contenido realmente devuelto. Es el campo de encabezado de entidad de Http. Se utiliza para describir el método de codificación de la solicitud o el cuerpo del mensaje devuelto. Existe tanto en el encabezado de solicitud como en el encabezado de respuesta.

Tipos comunes:

texto / (plano, css, html, xml) (texto, css, html, xml) tipo
aplicación / (x-javascript, json, xml, octet-stream) (js, json, xml, datos de flujo binario) tipo
imagen / png jpg imagen gif / *    

Cargar archivo de Excel: .xls     application/vnd.ms-excel

12. Problema de algoritmo: genera una matriz int {1, 2, 5, -7, 8, -10} tal que la submatriz continua con la suma más grande

 

para resumir:

La preparación esta vez es principalmente de conocimiento, no esperaba que la entrevista de bytes fuera de muy bajo nivel y no la revisé. . . No repasé las cuestiones algorítmicas, lo hice durante media hora y no pude. . . Se siente mucho más difícil que la entrevista de Ant Financial hace algún tiempo. . .

Supongo que te gusta

Origin blog.csdn.net/weixin_45440502/article/details/109586398
Recomendado
Clasificación