Preguntas y Respuestas de La Entrevista de Algoritmos

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 26

Preguntas y respuestas de la

entrevista de algoritmos

Un algoritmo es una parte integral de cualquier proceso, por lo que los


entrevistadores le harán muchas preguntas relacionadas con el algoritmo.

Aquí está la lista de algunas de las preguntas más frecuentes de la entrevista de


algoritmos y su respuesta . Estas preguntas también son beneficiosas para la
perspectiva de los exámenes académicos y competitivos.

1) ¿Qué es un algoritmo? ¿Cuál es la necesidad


de un algoritmo?
Un algoritmo es un procedimiento computacional bien definido que toma algunos
valores o el conjunto de valores como entrada y produce un conjunto de valores o
algunos valores como salida.

Necesidad de algoritmo

Pause
Unmute

Current Time 0:38

Duration 18:10
Loaded: 4.40%
Â
Fullscreen

El algoritmo proporciona la idea básica del problema y un enfoque para


resolverlo. Algunas razones para usar un algoritmo son las siguientes.

o El algoritmo mejora la eficiencia de una técnica existente.


o Comparar el rendimiento del algoritmo con respecto a otras técnicas.
o El algoritmo da una fuerte descripción de los requisitos y el objetivo de los
problemas para el diseñador.
o El algoritmo proporciona una comprensión razonable del flujo del
programa.
o El algoritmo mide el desempeño de los métodos en diferentes casos
(mejores casos, peores casos, promedio de casos).
o El algoritmo identifica los ciclos de recursos (entrada/salida, memoria)
requeridos por el algoritmo.
o Con la ayuda de un algoritmo podemos medir y analizar la complejidad
temporal y espacial de los problemas.
o El algoritmo también reduce el costo del diseño.

2) ¿Cuál es la complejidad del algoritmo?


La complejidad del algoritmo es una forma de clasificar qué tan eficiente es un
algoritmo en comparación con otros alternativos. Se centra en cómo aumenta el
tiempo de ejecución con el conjunto de datos a procesar. La complejidad
computacional del algoritmo es importante en computación.

Es muy adecuado para clasificar algoritmos en función de la cantidad relativa de


tiempo o la cantidad relativa de espacio que requieren y especificar el crecimiento
del requisito de tiempo/espacio en función del tamaño de entrada.

Complejidad del tiempo

La complejidad del tiempo es el tiempo de ejecución de un programa en función


del tamaño de la entrada.

Complejidad del espacio


La complejidad del espacio analiza los algoritmos, en función de cuánto espacio
necesita un algoritmo para completar su tarea. El análisis de la complejidad del
espacio fue fundamental en los primeros días de la informática (cuando el espacio
de almacenamiento en la computadora era limitado).

Hoy en día, el problema del espacio rara vez ocurre porque el espacio en la
computadora es lo suficientemente amplio.

Logramos los siguientes tipos de análisis de complejidad

Peor de los casos: f(n)

Se define por el número máximo de pasos dados en cualquier instancia de tamaño


n.

Mejor caso: f(n)

Se define por el número mínimo de pasos dados en cualquier instancia de tamaño


n.

Caso promedio: f(n)

Se define por el número promedio de pasos dados en cualquier instancia de


tamaño n.

3) Escriba un algoritmo para invertir una


cadena. Por ejemplo, si mi cadena es
"uhsnamiH", mi resultado será "Himanshu".
Algoritmo para invertir una cadena.

Paso 1: empezar

Paso 2: toma dos variables i y j

Paso 3: haga longitud (cadena) -1, para establecer J en la última posición

Paso 4: haga la cadena [0], para establecer i en el primer carácter.


Paso 5: la cadena [i] se intercambia con la cadena [j]

Paso 6: Incrementa i en 1

Paso 7: Incrementa j en 1

Paso 8: si i> j entonces vaya al paso 3

Paso 9: Detener

4) Escriba un algoritmo para insertar un nodo en


una lista ordenada ordenada.
Algoritmo para insertar un nodo en una lista ordenada ordenada.

Caso 1:

Compruebe si la lista enlazada está vacía, luego establezca el nodo como


encabezado y devuélvalo.

1. Nuevo_nodo-> Siguiente= cabeza;


2. Head=Nuevo_nodo

Caso2:

Inserte el nuevo nodo en el medio

1. Mientras (P! = posición de inserción)


2. {
3. P= p-> Siguiente;
4. }
5. Store_next=p->Siguiente;
6. P->Siguiente= Nuevo_nodo;
7. New_Node->Next = Store_next;

Caso3:

Insertar un nodo al final


1. Mientras (P->siguiente!= nulo )
2. {
3. P= P->Siguiente;
4. }
5. P->Siguiente = Nuevo_Nodo;
6. Nuevo_Nodo->Siguiente = nulo ;

5) ¿Qué son las Notaciones Asintóticas?


El análisis asintótico se usa para medir la eficiencia de un algoritmo que no
depende de las constantes específicas de la máquina y evita que el algoritmo
compare el algoritmo de toma de tiempo. La notación asintótica es una
herramienta matemática que se utiliza para representar la complejidad temporal de
los algoritmos para el análisis asintótico.

Las tres notaciones asintóticas más utilizadas son las siguientes.

Notación θ

La notación θ define el comportamiento asintótico exacto. Para definir un


comportamiento, limita las funciones desde arriba y desde abajo. Una forma
conveniente de obtener la notación Theta de una expresión es eliminar los
términos de orden inferior e ignorar las constantes iniciales.
Notación O grande

La notación Big O limita una función desde arriba, define un límite superior de un
algoritmo. Consideremos el caso del ordenamiento por inserción; toma tiempo
lineal en el mejor de los casos y tiempo cuadrático en el peor de los casos. La
complejidad temporal del ordenamiento por inserción es O(n 2 ). Es útil cuando
solo tenemos un límite superior en la complejidad del tiempo de un algoritmo.
Notación Ω

Al igual que la notación Big O proporciona un límite superior asintótico,


la notación Ω proporciona un límite inferior asintótico en una función. Es útil
cuando tenemos un límite inferior en la complejidad del tiempo de un algoritmo.
6) ¿Explicar el algoritmo de clasificación de
burbujas?
Bubble sort es el algoritmo de clasificación más simple entre todos los algoritmos
de clasificación. Funciona repetidamente intercambiando los elementos adyacentes
si están en el orden incorrecto.

p.ej

(72538) tenemos esta matriz para ordenar.

Pase1:

( 72 538) -> (27538) intercambiar 7 y 2.


(2 75 38) -> (25738) intercambiar 7 y 5.
(25 73 8) -> (25378) intercambiar 7 y 3.
(253 78 ) -> (25378) el algoritmo no intercambia 7 y 8 porque 7<8.

Pase2:
(2 5 378) -> (25378) el algoritmo no intercambia 2 y 5 porque 2<5.
(2 53 78) -> (23578) intercambia 3 y 5.
(23 57 8) -> (23578) el algoritmo no intercambia 5 y 7 porque 5<7.
(235 78 ) -> (23578) el algoritmo no intercambia 7 y 8 porque 7<8.

Aquí, el elemento ordenado es (23578).

7) ¿Cómo intercambiar dos enteros sin


intercambiar la variable temporal en Java?
Es una pregunta capciosa muy común. Hay muchas maneras de resolver este
problema.

Pero la condición necesaria es que tenemos que resolverlo sin cambiar la variable
temporal.

Si pensamos en el desbordamiento de enteros y consideramos su solución, crea


una excelente impresión a los ojos de los entrevistadores.

Supongamos que tenemos dos números enteros I y j, el valor de i=7 y j=8,


entonces, ¿cómo los intercambiará sin usar una tercera variable? Este es un
problema del diario.

Necesitamos hacer esto usando construcciones de programación Java. Podemos


intercambiar números realizando algunas operaciones matemáticas como suma,
resta, multiplicación y división. Pero tal vez creará el problema del desbordamiento
de enteros.

Usando la suma y la resta

1. a = a + b;
2. b=a - b; // esto actuará como (a+b)-b, ahora b es igual a a.
3. a=a - b; // (a+b)-a, ahora, a es igual a b.

Es un buen truco. Pero en este truco, el número entero se desbordará si la suma es


mayor que el valor máximo de la primitiva int definida por Integer.MAX_VALUE y si
la resta es menor que el valor mínimo, es decir, Integer.MIN_VALUE.

Usando el truco XOR


Otra solución para intercambiar dos enteros sin usar una tercera variable (variable
temporal) es ampliamente reconocida como la mejor solución, ya que también
funcionará en un lenguaje que no maneja el desbordamiento de enteros como el
ejemplo de Java C, C++. Java admite varios operadores bit a bit. Uno de ellos es
XOR (indicado por ^).

1. x=x^y;
2. y=x^y;
3. x=x^y;

8) ¿Qué es una tabla hash? ¿Cómo podemos usar


esta estructura para encontrar todos los
anagramas en un diccionario?
Una tabla Hash es una estructura de datos para almacenar valores en claves de tipo
arbitrario. La tabla Hash consta de un índice en una matriz mediante el uso de una
función Hash. Los índices se utilizan para almacenar los elementos. Asignamos
cada elemento posible a un cubo usando una función hash. Se pueden asignar
varias claves al mismo depósito, por lo que todos los pares de clave y valor se
almacenan en listas dentro de sus respectivos depósitos. La función hash correcta
tiene un gran impacto en el rendimiento.

Para encontrar todos los anagramas en un diccionario, tenemos que agrupar todas
las palabras que contienen el mismo conjunto de letras. Entonces, si asignamos
palabras a cadenas que representan sus letras ordenadas, entonces podríamos
agrupar palabras en listas usando sus letras ordenadas como clave.

1. FUNCIÓN buscar_anagramas (palabras)


2. word_groups = HashTable<Cadena, Lista>
3. POR palabra EN palabras
4. word_groups.get_or_default(ordenar(palabra), []).push(palabra)
5. FIN PARA
6. anagramas = lista
7. FOR clave, valor IN word_groups
8. anagramas.push(valor)
9. FIN PARA
10. VOLVER anagramas

La tabla hash contiene listas asignadas a cadenas. Para cada palabra, la agregamos
a la lista en la tecla adecuada, o creamos una nueva lista y la agregamos.

9) ¿Qué son los algoritmos Divide and Conquer?


Divide and Conquer no es un algoritmo; es un patrón para el algoritmo. Está
diseñado de manera que se discuta una gran entrada, se divida la entrada en
partes menores y se decida el problema para cada una de las partes
pequeñas. Ahora combine todas las soluciones por partes en una solución
global. Esta estrategia se llama divide y vencerás.

Divide y vencerás utiliza los siguientes pasos para hacer una disputa sobre un
algoritmo.

Dividir: en esta sección, el algoritmo divide el problema original en un conjunto de


subproblemas.

Conquistar: en esta sección, el algoritmo resuelve cada subproblema


individualmente.

Combinar: en esta sección, el algoritmo reúne las soluciones de los subproblemas


para obtener la solución del problema completo.

10) ¿Explicar el algoritmo BFS?


BFS (Breadth First Search) es un algoritmo transversal de grafos. Comienza
atravesando el gráfico desde el nodo raíz y explora todos los nodos
vecinos. Selecciona el nodo más cercano y visita todos los nodos no explorados. El
algoritmo sigue el mismo procedimiento para cada uno de los nodos más cercanos
hasta llegar al estado objetivo.

Algoritmo

Paso 1: Establecer estado = 1 (estado listo)

Paso 2: ponga en cola el nodo inicial A y establezca su estado = 2, es decir (estado


de espera)
Paso 3: Repita los pasos 4 y 5 hasta que la cola esté vacía.

Paso 4: quite la cola de un nodo N, procéselo y establezca su estado = 3, es decir


(estado procesado)

Paso 5: poner en cola a todos los vecinos de N que están en estado listo (estado =
1) y establecer su estado = 2 (estado de espera)
[Detener bucle]

Paso 6: Salir

11) ¿Cuál es el algoritmo de ruta más corta de


Dijkstra?
El algoritmo de Dijkstra es un algoritmo para encontrar la ruta más corta desde un
nodo de inicio hasta el nodo de destino en un gráfico ponderado. El algoritmo crea
un árbol de las rutas más cortas desde el vértice inicial y el vértice de origen hasta
todos los demás nodos del gráfico.

Suponga que desea ir de su casa a la oficina de la manera más corta posible. Usted
sabe que algunas carreteras están muy congestionadas y es difícil usar esto, lo que
significa que estos bordes tienen un gran peso. En el algoritmo de Dijkstra, el árbol
de ruta más corto encontrado por el algoritmo intentará evitar los bordes con
pesos más grandes.

12) ¿Dé algunos ejemplos del algoritmo Divide and


Conquer?
A continuación se enumeran algunos problemas que utilizan el algoritmo Divide y
vencerás para encontrar su solución.

o Ordenar por fusión


o Ordenación rápida
o Búsqueda binaria
o Multiplicación de matrices de Strassen
o Par más cercano (puntos)

13) ¿Qué son los algoritmos codiciosos? ¿Dar


algún ejemplo de ello?
Un algoritmo codicioso es una estrategia algorítmica que se crea para la mejor
elección óptima en cada subetapa con el objetivo de que esto, finalmente,
conduzca a una solución óptima global. Esto significa que el algoritmo elige la
mejor solución en el momento sin tener en cuenta las consecuencias.

En otras palabras, un algoritmo que siempre toma la mejor solución inmediata o


local mientras encuentra una respuesta.

Los algoritmos codiciosos encuentran la solución ideal general para algunos


problemas idealistas, pero pueden descubrir soluciones menos que ideales para
algunos casos de otros problemas.

A continuación se muestra una lista de algoritmos que encuentran su solución con


el uso del algoritmo Greedy.

o Problema del vendedor ambulante


o Algoritmo de árbol de expansión mínimo de Prim
o Algoritmo de árbol de expansión mínimo de Kruskal
o Algoritmo de árbol de expansión mínimo de Dijkstra
o Gráfico - Mapa para colorear
o Gráfico - Cubierta de vértice
o Problema de mochila
o Problema de programación de trabajos

14) ¿Qué es una búsqueda lineal?


La búsqueda lineal se utiliza en un grupo de elementos. Se basa en la técnica de
recorrer una lista de principio a fin visitando las propiedades de todos los
elementos que se encuentran en el camino.
Por ejemplo, supongamos una matriz con algunos elementos enteros. Debe buscar
e imprimir la posición de todos los elementos con su valor. Aquí, la búsqueda lineal
actúa en un flujo como hacer coincidir cada elemento desde el principio de la lista
hasta el final de la lista con el número entero, y si la condición es 'Verdadera,
entonces se imprime la posición del elemento'.

Implementando la búsqueda lineal

Se requieren los siguientes pasos para implementar la búsqueda lineal.

Paso 1: recorre la matriz usando for loop .

Paso 2: en cada iteración, compare el valor objetivo con el valor actual de la matriz

Paso 3: si los valores coinciden, devuelve el índice actual de la matriz

Paso 4: si los valores no coinciden, cambie al siguiente elemento de la matriz.

Paso 5: si no se encuentra ninguna coincidencia, devuelve -1

15) ¿Qué es un árbol de búsqueda binario?


El árbol de búsqueda binaria es un tipo especial de estructura de datos que tiene
las siguientes propiedades.

o Los nodos que son menores que la raíz estarán en el subárbol izquierdo.
o Los nodos que son mayores que la raíz (es decir, contienen más valor) serán
el subárbol derecho.
o Un árbol de búsqueda binario no debe tener nodos duplicados.
o El subárbol de ambos lados (es decir, izquierdo y derecho) también debe ser
un árbol de búsqueda binaria.
16) ¿Escribir un algoritmo para insertar un nodo
en el árbol de búsqueda binario?
La operación de inserción de nodos es una operación fluida. Debe compararlo con
el nodo raíz y atravesarlo hacia la izquierda (si es más pequeño) o hacia la derecha
(si es más grande) según el valor del nodo que se va a insertar.

Algoritmo:

o Hacer que el nodo raíz sea el nodo actual


o Si el nodo a insertar < root
o Si ha dejado a un niño, entonces cruce a la izquierda
o Si no tiene hijo izquierdo, inserte el nodo aquí
o Si el nodo a insertar > root
o Si tiene el hijo correcto, atravesar a la derecha
o Si no tiene el hijo correcto, inserte el nodo aquí.
17) ¿Cómo contar los nodos hoja del árbol
binario?
Algoritmo-

Los pasos para contar el número de nodos hoja son:

o Si el nodo es nulo (contiene valores nulos), devuelve 0.


o Si se encuentra un nodo de hoja. Left es nulo y el nodo Right es nulo, luego
devuelve 1.
o Calcule recursivamente el número de nodos hoja usando

No. de nodos de hoja = no de nodos de hoja en el subárbol izquierdo + número


de nodos de hoja en el subárbol derecho.

18) ¿Cómo encontrar todas las palabras posibles


en un tablero de personajes (juego de Boggle)?
En el diccionario dado, un proceso para realizar una búsqueda en el diccionario y
un tablero M x N donde cada celda tiene un solo carácter. Identifica todas las
palabras posibles que se pueden formar por orden de caracteres
adyacentes. Considere que podemos movernos a cualquiera de los 8 caracteres
adyacentes disponibles, pero una palabra no debe tener múltiples instancias de la
misma celda.

Ejemplo:

1. diccionario[] = { "Java" , "Punto" , "Cuestionario" };


2. Matriz[][] = {{ 'J' , 'T' , 'P' ,},
3. { 'T' , 'A' , 'A' },
4. { 'Q' , 'S' , 'V' }};
5. isWord(str): devuelve verdadero si str está presente en el diccionario
6. de lo contrario falso .

Producción:

Las siguientes palabras del diccionario están presentes


JAVA

19) ¿Escribir un algoritmo para insertar un nodo


en una lista de enlaces?
Algoritmo

o Verifique si la lista vinculada no tiene ningún valor, entonces haga el nodo


como encabezado y devuélvalo
o Compruebe si el valor del nodo que se va a insertar es menor que el valor
del nodo principal, luego inserte el nodo al principio y conviértalo en la
cabeza.
o En un bucle, busque el nodo apropiado después del cual se insertará el
nodo de entrada. Para encontrar el comienzo del nodo justo desde la
cabeza, siga avanzando hasta llegar a un nodo cuyo valor sea mayor que el
nodo de entrada. El nodo justo antes es el nodo apropiado.
o Inserte el nodo después del nodo adecuado encontrado en el paso 3.

20) ¿Cómo eliminar un nodo en una lista de


enlaces determinada? ¿Escribir un algoritmo y un
programa?
Escriba una función para eliminar un nodo dado de una lista de enlaces
individuales. La función debe seguir las siguientes restricciones:

o La función debe aceptar un puntero al nodo inicial como primer argumento


y el nodo a eliminar como segundo argumento, es decir, un puntero al nodo
principal no es global.
o La función no debe devolver un puntero al nodo principal.
o La función no debe aceptar puntero a puntero a nodo principal.

Podemos suponer que la Lista enlazada nunca se vacía.


Supongamos que el nombre de la función es delNode(). En una implementación
directa, la función necesita ajustar el puntero de la cabeza cuando el nodo se
elimina como el primer nodo.

Programa en C para eliminar un nodo en la lista enlazada

Manejaremos el caso cuando se elimine el primer nodo, luego copiaremos los


datos del siguiente nodo al encabezado y eliminaremos el siguiente nodo. En otros
casos, cuando un nodo eliminado no es el nodo principal, generalmente se puede
manejar encontrando el nodo anterior.

1. #incluir <stdio.h>
2. #incluir <stdlib.h>
3. nodo de estructura
4. {
5. datos int ;
6. struct Nodo *siguiente;
7. };
8.
9. void delNodo( struct Nodo *head, struct Nodo *n)
10. {
11. si (cabeza == n)
12. {
13. if (cabeza->siguiente == NULL)
14. {
15. printf ( "la lista no se puede dejar vacía porque solo hay un
nodo". );
16. volver ;
17. }
18. cabeza->datos = cabeza->siguiente->datos;
19. n = cabeza->siguiente;
20. cabeza->siguiente = cabeza->siguiente->siguiente;
21. libre(n);
22. volver ;
23. }
24. struct Nodo *anterior = cabeza;
25. while (anterior->siguiente!= NULL && anterior->siguiente!= n)
26. anterior = anterior->siguiente;
27. si (anterior->siguiente == NULL)
28. {
29. printf( "\n Este nodo no está presente en la Lista" );
30. volver ;
31. }
32. anterior->siguiente = anterior->siguiente->siguiente;
33. libre(n);
34. volver ;
35. }
36. void push( struct Node **head_ref, int new_data)
37. {
38. struct Nodo *nuevo_nodo =
39. ( struct Nodo *)malloc( tamaño de ( struct Nodo));
40. nuevo_nodo->datos = nuevos_datos;
41. nuevo_nodo->siguiente = *head_ref;
42. *head_ref = nuevo_nodo;
43. }
44. void imprimirLista( struct Nodo *cabeza)
45. {
46. mientras (cabeza! = NULL)
47. {
48. printf( "%d " ,cabeza->datos);
49. cabeza=cabeza->siguiente;
50. }
51. imprimirf( "\n" );
52. }
53. int principal()
54. {
55. estructura Nodo *head = NULL;
56. empujar(&cabeza,3);
57. empujar(&cabeza,2);
58. empujar(&cabeza,6);
59. empujar(&cabeza,5);
60. empujar(&cabeza,11);
61. empujar(&cabeza,10);
62. empujar(&cabeza,15);
63. empujar(&cabeza,12);
64. printf( "Lista de enlaces disponibles:" );
65. imprimirLista(cabeza);
66. printf( "\nEliminar nodo %d: ", encabezado->siguiente->siguiente-
>datos);
67. delNode(cabeza, cabeza->siguiente->siguiente);
68.
69. printf( "\nLista enlazada actualizada: " );
70. imprimirLista(cabeza);
71.
72. /* Vamos a borrar el primer nodo */
73. printf( "\nEliminar primer nodo" );
74. delNodo(cabeza, cabeza);
75.
76. printf( "\nLista enlazada actualizada: " );
77. imprimirLista(cabeza);
78.
79. getchar();
80. devolver 0;
81. }

Producción:

Lista de enlaces disponibles: 12 15 10 11 5 6 2 3


Eliminar nodo 10:
Lista vinculada actualizada: 12 15 11 5 6 2 3
Eliminar primer nodo
Lista vinculada actualizada: 15 11 5 6 2 3
21) ¿Escribir un programa ac para fusionar una
lista de enlaces con otra en una posición
alternativa?
Tenemos dos listas enlazadas, inserte nodos de la segunda lista en la primera lista
en posiciones sustitutas de la primera lista.

Ejemplo

si la primera lista es 1->2->3 y la segunda es 12->10->2->4->6, la primera lista


debe convertirse en 1->12->2->10->17->3- >2->4->6 y la segunda lista debería
quedar vacía. Los nodos de la segunda lista solo deben insertarse cuando haya
posiciones disponibles.

No se permite el uso de espacio adicional, es decir, la inserción debe realizarse en


un lugar. La complejidad de tiempo predecible es O(n) donde n es el número de
nodos en la primera lista.

1. #incluir <stdio.h>
2. #incluir <stdlib.h>
3. nodo de estructura
4. {
5. datos int ;
6. struct Nodo *siguiente;
7. };
8. void push( struct Node ** head_ref, int new_data)
9. {
10. struct Nodo* nuevo_nodo =
11. ( struct Node*) malloc( sizeof ( struct Node));
12. nuevo_nodo->datos = nuevos_datos;
13. nuevo_nodo->siguiente = (*head_ref);
14. (*head_ref) = nuevo_nodo;
15. }
16. void imprimirLista( struct Nodo *cabeza)
17. {
18. struct Nodo *temp = cabeza;
19. mientras (temp != NULL)
20. {
21. printf( "%d" , temperatura->datos);
22. temp = temp->siguiente;
23. }
24. imprimirf( "\n" );
25. }
26. void merge( struct Nodo *p, struct Nodo **q)
27. {
28. struct Nodo *p_curr = p, *q_curr = *q;
29. estructura Nodo *p_siguiente, *q_siguiente;
30. while (p_curr != NULL && q_curr != NULL)
31. {
32. p_siguiente = p_actual->siguiente;
33. q_siguiente = q_actual->siguiente;
34. q_actual->siguiente = p_siguiente;
35. p_curr->siguiente = q_curr;
36. p_actual = p_siguiente;
37. q_actual = q_siguiente;
38. }
39.
40. *q = q_actual;
41. }
42. int principal()
43. {
44. struct Nodo *p = NULL, *q = NULL;
45. empujar(&p, 3);
46. empujar(&p, 2);
47. empujar(&p, 1);
48. printf( "Lista I Vinculada:\n" );
49. imprimirLista(p);
50.
51. empujar(&q, 8);
52. empujar(&q, 7);
53. empujar(&q, 6);
54. empujar(&q, 5);
55. empujar(&q, 4);
56. printf( "II lista enlazada:\n" );
57. imprimirLista(q);
58.
59. fusionar(p, &q);
60.
61. printf( "Lista I Linked actualizada:\n" );
62. imprimirLista(p);
63.
64. printf( "Lista enlazada II actualizada:\n" );
65. imprimirLista(q);
66. getchar();
67. devolver 0;
68. }

Producción:

Lista enlazada:
1 2 3
II Lista Vinculada:
4 5 6 7 8
Lista I Linked actualizada:
1 4 2 5 3 6
Lista actualizada de enlaces II:
7 8

22) Explique cómo funciona el algoritmo de


encriptación.
El cifrado es la técnica de convertir texto sin formato en un formato de código
secreto, también se denomina "texto cifrado". Para convertir el texto, el algoritmo
utiliza una cadena de bits denominada "claves" para los cálculos. Cuanto mayor sea
la clave, mayor será el número de patrones potenciales para el cifrado. La mayoría
de los algoritmos usan códigos de bloques fijos de entrada que tienen una
longitud de aproximadamente 64 a 128 bits, mientras que algunos usan el método
de transmisión para el cifrado.
23) ¿Cuáles son los criterios del análisis de
algoritmos?
Un algoritmo es generalmente analizado por dos factores.

o Complejidad del tiempo


o Complejidad del espacio

La complejidad del tiempo se ocupa de la cuantificación de la cantidad de tiempo


que tarda un conjunto de código o algoritmo en procesarse o ejecutarse en
función de la cantidad de entrada. En otras palabras, la complejidad del tiempo es
la eficiencia o el tiempo que tarda una función del programa en procesar una
entrada dada.

La complejidad del espacio es la cantidad de memoria utilizada por el algoritmo


para ejecutar y producir el resultado.

24) ¿Cuáles son las diferencias entre pila y cola?


Stack y Queue son estructuras de datos no primitivas que se utilizan para
almacenar elementos de datos y se basan en algún equivalente del mundo real.

Echemos un vistazo a las diferencias clave basadas en los siguientes parámetros.

Principio de funcionamiento

La diferencia significativa entre la pila y la cola es que la pila usa el método LIFO
(Último en entrar, primero en salir) para acceder y agregar elementos de datos,
mientras que Queue usa el método FIFO (Primero en entrar, primero en salir) para
obtener el miembro de datos.

Estructura

En Stack, el mismo extremo se usa para almacenar y eliminar elementos, pero en


Queue, un extremo se usa para la inserción, es decir, el extremo posterior y el otro
extremo se usa para la eliminación de elementos.
Número de punteros utilizados

Stack usa un puntero mientras que Queue usa dos punteros (en el caso simple).

Operaciones realizadas

Stack funciona como Push y pop, mientras que Queue funciona como Enqueue y
dequeuer.

variantes

Stack no tiene variantes, mientras que Queue tiene variantes como una cola
circular, una cola de prioridad, una cola de dos extremos.

Implementación

La pila es más simple mientras que Queue es comparativamente compleja.

25) ¿Cuál es la diferencia entre la estructura de


datos de la Lista de enlaces simples y la Lista de
enlaces dobles?
Esta es una pregunta de entrevista tradicional sobre la estructura de datos. La
principal diferencia entre la lista de enlaces simples y la lista de enlaces dobles es la
capacidad de atravesar.

No puede retroceder en una lista enlazada individualmente porque en ella un nodo


solo apunta hacia el siguiente nodo y no hay un puntero al nodo anterior.

Por otro lado, la lista doblemente enlazada te permite navegar en ambas


direcciones en cualquier lista enlazada porque mantiene dos punteros hacia el
nodo siguiente y anterior.

Consejos para la entrevista Preguntas de

Preguntas de la entrevista de JavaScript Preguntas de


Preguntas de la entrevista sobre conceptos básicos de Java Preguntas de

Preguntas de la entrevista de servlets Preguntas de

Preguntas de la entrevista de primavera Preguntas de

Preguntas de la entrevista PL/SQL Preguntas de

Preguntas de la entrevista de Oracle Preguntas de

Preguntas de la entrevista del servidor SQL Preguntas de

También podría gustarte