Publicado hace 14 años por --3628-- a blog.seattleinterviewcoach.com

Recopilación de preguntas que distintos entrevistados por Google han ido facilitando. Están agrupadas por áreas.

Comentarios

Sedda

#4

lol

Sermineitor

#4 Soy el único que alucina?

youknow

#25 Si ves la pelicula "Amanece que no es poco" lo entenderas. Se trata de la leccion que les esta enseñando el profesor a los alumnos. Es una pelicula muy surrealista tampoco intestes buscarle mucha explicacion.

j

#50 "Causa admiración.. causa admiracióoon, causa admiración, cómo trabaja el corazón". Dios, qué grande es la escuela en esa película lol

PD: Found:


PD y las ingles:

w

#25 Alucina, que no es poco.

j

#3: Si lo piensas bien, te darás cuenta que esa es precisamente la peor (por lo menos si quieres que te contraten)

anxosan

#12 Supongo que en ese caso la respuesta que buscan es que tienes que repartir de modo que te quedes sin nada (es la única opción donde, a priori, no sacan beneficio por matarte); aunque a mi me interesaría más saber como se llega a esa situación, es decir, si eres el jefe de los piratas ¿Qué mierda de jefatura es esa donde te matan si una decisión no le gusta a la mayoría?, ¿Cómo se asciende de rango?, ¿Si te matan tu sucesor tendrá el mismo problema? (porque en ese caso siempre puedes dejarle sin nada porque sabe lo que le espera si no está de acuerdo)...

Aguarate

#12 #13 lol un ejercicio parecido (parecido porque son piratas y 100 monedas nos pusieron en Discreta: Una banda de 17 piratas, se reúne para repartirse un cofre con más de cien monedas de oro. Efectuado
equitativamente el reparto sobra una moneda. En la pelea resultante para adjudicarla muere un pirata y
vuelven a realizar el reparto sobrando una moneda. ¿Cuál es el mínimo número de monedas que puede
contener el cofre?
Supongamos que la solución anterior es el número real de monedas que contenía el cofre y que la historia
continúa: siempre que sobran monedas en el reparto hay pelea y muere un pirata, ¿cuántos piratas quedarán
vivos cuando en el reparto no sobre ninguna moneda?

Se resuelve con ecuaciones diofánticas

LesPaul

#14 por casualidad en qué universidad estudias? jaja es que ese mismo ejercicio lo hice yo tambien

Aguarate

#36 Politecnica de Madrid lol

LesPaul

#67 ya decia yo que me sonaba... lol

R

#14 Por cierto, con todo el respeto del mundo, resolveríais eso en matemática discreta con ecuaciones diofánticas, pero eso en mi colegio se llamaba cálcular el minimo común multiplo de 17 y 16 (sumar 1 para la respuesta), y luego a la respuesta la factorizas y el divisor mayor (imagino que eso en Discreta sería un cero, pero recuerda a la EGB)

D

#12 Podrías proponer repartir el botín entre 3 de los piratas y a los otros dos no darles nada. Incluso, podrías proponer quedarte la mitad del botín, a otros dos piratas darles un cuarto a cada uno y a otros dos nada. Lo más probable es que los otros dos piratas acepten.

jomi_mc

#12 El capitan se queda con 98 y se vota a si mismo, a otros 2 piratas les das 1 moneda, ya tienen beneficio suficiente. Los otros 2 votarian en contra, pero son 2 en contra contra 3 a favor. El capitan obtiene el mayor beneficio y salva el cuello. Es asi, es una pregunta que de una asignatura de libre eleccion de mi antigua universidad, asi que conozco la respuesta
La cuestion de este ejercicio es conseguir tu el mayor beneficio monetario posible, no darselo a otro
#16 256 cm^3 de pelota, no son ni las pelotas de un toro... 256 cm^3 es casi 1/4 de litro... te has colado en la formula del volumen de la esfera (es el radio, no el diametro) y es posible que en el calculo por lo demas el razonamiento es bueno

diophantus

#28 pero como que el razonamiento es bueno? Y el aire entre las pelotas quien se lo come?

C

#29 hmmmm ñam! aaaire gratis!!! lol

woopi

#29 el aire entre las pelotas, teniendo en cuenta el apilamiento, podría estimarse como un 25% del volumen total (Densidad de 1-pi/sqrt(18)).

D

#29 son órdenes de magnitud (aunque me haya confundido con la formula de la esfera, eso pasa por no mirarlo en google, fiarme de yahoo answers) El resultado te da una primera aproximacion válida, si te fijas en el calculo he dicho que pi=3. SI calculamos otra vez porque me he liado con el tamaño de la esfera, digamos que r= 2 cm (32 cm3) o r=2,5 cm (62,5 cm3). Para hacerlo mas facil voy a decir que V=54 cm3, por o que caben 1.000.000 de pelotas.
#51 cierto es. La hora vale como excusa?

g

#28 Si claro, si los piratas son tontos sí, no creo que los piratas se conformaran con 1 moneda solamente. Pero sí, la respuesta sería darle a 2 la mínima cantidad para que acepten y al resto ni papa. No es muy complicado la verdad

D

#28 #38 En el problema de los piratas, hagas lo que hagas siempre te cortarán el pescuezo. Los piratas saben que eliminando compañeros habrá más a repartir. La solución es delegar al pirata 5 para que reparta el oro para que le corten el pescuezo. Luego se delega en el pirata 4 para que reparta el oro y posiblemente también se le cortará el pescuezo. Y así hasta que solo quede 1 pirata.

araujo

#16 Estoy convencido de que la respuesta que esperan es la que ha dado #11: TODAS.

j

#11, #37 La pregunta es "cuántas" caben, no "cuáles" caben. "TODAS" es una respuesta sumamente incorrecta

Y también para #5, este tipo de pregunta es lo que se denomina Problema de Fermi. La razón para este nombre está explicada de forma amena -como siempre- en Historias de la Ciencia: http://www.historiasdelaciencia.com/?p=15. También más info en la Wikipedia (http://es.wikipedia.org/wiki/Problema_de_Fermi) donde también se muestra cómo razonar ante estos problemas.

Oh, y son muy útiles. Básicamente cuando te hacen una pregunta de estas lo que van a ver es cómo reacciones ante una pregunta sobre la que a priori no tienes ni idea. Cómo improvisas. Para un buen ingeniero eso es MUY importante.

leonard_shelby

#39 Cabe una.

D

#5 no sé en las ingenierías (yo soy ingeniero pero comence haciendo física), pero en primero de física se nos hablaba sobre el calculo de magnitudes, para tener una primera idea.

Vamos a considerar un autobus de 9 x 3 x 2= 54 m3= 54.000.000 cm3 Si cada pelota tiene un diametro de 4 cm , y el volumen de una esfera es 4/3*pi*d^3. Para simplificar vamos a suponer que pi=3 (es por simplificar, es solo calculo de magnitudes), por lo tanto son 256 cm3 por pelota. Para hacer mas facil el calculo vamos a decir que son 270 cm3, por lo que caben unas 200.000 pelotas. Fácil ¿no?

diophantus

#16 porque de todos es sabido que las esferas teselan el espacio, claaaro.

d

#26 Por no hablar de las pelotas de 270cm^3, cosa de confundir radio y diámetro.
Digamos que no le faltara mucho para el millón con los datos propuestos y sabiendo que el cubo de lado 4 tiene 64cm^3

woopi

#16 ¡¡¡270cm3 por pelota!!!! OMG!

g

#16 creo que las magnitudes físicas siguen siendo 7. Te refieres a los órdenes de magnitud

D

#6 La coma se coló, pero ya no puedo editar.

julictus

#6 Ahora que está editado, ¿a qué coma te referías?

j

#62 Hombre... vale. Entonces tengo una más sencilla: http://xkcd.com/221/

D

#65 como chiste vale.

zakrion

Joer con las preguntitas para Software Engineer...

frankiegth

Para #8. Es que eso es precisamente lo que estudia un ingeniero de software en una buena universidad.

zakrion

#23 La mía aparece como mucho en la mitad de la tabla en rankings de universidades españolas y puedo decir que tengo la base como para responder a todas las preguntas si me lo preparo un poco. La mayoría de los problemas que plantean no los había visto en mi vida, pero se me ocurre mas o menos como plantearlos.

Mi comentario anterior iba mas bien orientado a que te piden saber mucho de todo, pero todo todo. Y eso no es para nada habitual en otras entrevistas para este tipo de puestos, pero bueno, está claro que Google quiere a los mejores.

D

#89
Hummm....

P

#43, ¿dónde dice que sólo sean dos llamadas?

Given a function which produces a random integer in the range 1 to 5, write a function which produces a random integer in the range 1 to 7.

La solución fácil es generar 7 números con el random5(), sumarlos y hacer módulo 7, de esta manera los valores están correctamente distribuidos del 1 al 7.

#41, con esa expresión condicionas mucho el resultado y la distribución, mira los ejemplos que me salen para 10 millones de generaciones:

1: 1199333
2: 1601725
3: 1598142
4: 1599275
5: 1601882
6: 1198989
7: 1200654

En cambio, con la solución propuesta de generar 7 números, sumarlos y realizar un módulo 7, el resultado es una distribución uniforme (aunque claro, la ejecución también tarda más):

1: 1429887
2: 1429379
3: 1428431
4: 1426998
5: 1428015
6: 1428564
7: 1428726

RaiderDK

#48 eso, el modulo lol

D

#41 #35 #48 más fácil

F7 = Parte entera de: (F5 + 2) / F5

j

#55 No es que sea una distribución muy uniforme... http://yfrog.com/jddistributionp

Histograma hecho con MATLAB usando un millón de muestras.

D

#57 No se pide uniformidad en los resultados.

Irrelevanterrimo

He leido todos los post y he llegado a la conclusión que a Google se la pela como consigas un número aleatorio entre 1 y 7 con una función de 1 a 5... lo que quiere son flames como este hablando de google. lol lol

Por cierto, para hacer un número aleatorio entre 1 y 7 hay que hacer:

int random7()

y a seguir...

j

Tranquilos. Màtigues está entretenido y no podrá esparcir la fuga por toda la costa cantábrica.

IndividuoDesconocido

edit he escrito lo mismo que #43

D

¿#55 y simplemente escalando?
f7= f5*7/5
no sé si matematicamente será consistente, pero no tiene porque no serlo.

IndividuoDesconocido

Pues a mi me ha gustado esta:
Dada una función que genera un número aleatorio entre 1 y 5 crear una función que genere un numero aleatorio entre 1 y 7
la estoy pensando

o o o o o
o o o o o o o

j

sorry por el double post, pero es que no había visto #35 antes. Yo voto por multiplicar el resultado de aplicar dos veces esa función y hacer módulo 7. Pero no tengo ni idea de si la distribución de lo que propongo sería uniforme... (claro, que ellos no dicen que tenga que serlo).

R

#41 no, no lo seria, ya que como ejemplo, si tomas de 1 a 5, ningun resultado te dara modulo 0 (no aparece ni el 7, ni el 14 ni el 21), y si tomas el 0, el mod0 son demasiados resultados.

Desde mi punto de vista, al tener 25 posibles resultados (con dos llamadas a la función que te dan), y no ser este divisible entre 7, no tienes manera de hacerlo directamente y que sea completamente aleatorio, hay que descartar resultados. La manera mas sencilla de todas (que no la mejor) seria tomar dos numeros y traducir el equivalente en esta matriz:

00011
12223
33444
55566
6RRRR

Donde R seria repetir la obtención de indices (si, en teoria podria estar toda la eternidad para dar el resultado)

RaiderDK

#41 #35
se aplica la funcion 7 veces sumando los resultados, obtenienod un numero entre 7 y 35, dividimos entre 7 y ya lo tenemos (para hacerla totalmente uniforme no tengo claro como redondear esa división, sigo pensando)

D

#35 Para ese problema; generas dos numeros aleatorios de 1 al 5 (A y B) y calculas (A+(B-1)*7)%7.

Y para hilar más fino si A+(B-1)*7 > 21 se debería volver a generar los números.

totem

la del autobus es facil:

"Supongamos A un autobus cúbico de lado #A, y P1...Pn... pelotas de golf también cúbicas de lado #P. Entonces... "

D

#45 Sorry! Edit La fórmula es (A+(B-1)*5)%7

D

Pues a ver si se ponen las pilas porque algunos servicios como Google Groups están bastante necesitados de algo de cariño. De pensar lo felices que nos la prometíamos cuando compraron Deja News.

j

#56 Sería tan fácil con divisiones... ¿se puede elevar a menos uno y multiplicar? lol

D

Yo me estoy quedando noqueado haciendo esta:

You are given an array [a1 To an] and we have to construct another array [b1 To bn] where bi = a1*a2*...*an/ai. you are allowed to use only constant space and the time complexity is O(n). No divisions are allowed.

sotanez

#21 Me pregunto si eso lo tienes que hacer mientras está el entrevistador esperándote o más en plan examen.

mikibcn

#21 La forma de resolver la operación "a1 * a2 * .. * an / ai" sin divisiones es bien sencilla: "Si tenemos un número K * l / l el resultado es k"; de esta forma la operación se reduce a "a1 * a2 * ... a(i-1) * a(i+1) * ... * an".

Por otra parte veo que hay que hacer un recorrido al vector A y al vector B, cada uno con n posiciones, y eso es complejidad de tiempo O(n^2); así que NO PODRÉ TRABAJAR EN GOOGLE!!!!! cry

¿Seguro que se puede hacer en O(n), porque no veo la manera de recorrer A y B simultáneamente? ¿Algún ingeniero iluminado?

R

#56 Estoy contigo, me ha mosqueado un poco esa pregunta (lo bastante para hacerme perder un buen rato antes de irme a dormir). No veo manera de hacer en un tiempo O(n) si no tengo los dos strings ordenados de alguna forma (con ellos ordenados es trivial). Por tanto, como mucho, se baja a un orden n*log(n) que viene dado por la ordenación, pero mas alla, no veo nada.

D

#21 #56 #64 #73 #78

no se si es lo mismo que #78 (que no lo acabo de ver...):

Procedure trabajarengoogle (var a,b: array of integer ; m,i:integer);

begin
trabajarengoogle (a, b, m*a[i], i+1);
b[i]:= m;
end;

Yo creo que esa es la idea, ya que es simple y se recorre el array una sola vez...

Si al final va a ser mas dicil trabajar en google que los examenes de mi facultad y todo

Si alguien da trabajo, y aunque no sea en google, esta bien, me apunto!!

a

#80 Qué es 'm'?

Por lo que veo en tu universidad también se programa en pascal/delphi, no?

D

#80 #81

i lo uso para recorrer el array, m para ir guardando la multiplicacion (y asi a la vuelta de recursividad asignarlo a b).

La llamada inicial al procedimiento seria:

trabajarengoogle (a, b, 1, 1);

#81 Pues si, con pascal aprendi...

a

#78 Lo he estado pensando y no veo por qué se tienen que recorrer los arrays 3 veces. Necesitas recorrer 'a' 1 vez para obtener 'c' y 'd', ¿no? Y luego recorrer 1 vez 'b' para ir asignando los resultados. ¿Hay algo que no he entendido de tu planteamiento?

#82 Con lo que tienes puesto no haces nunca la división (o el no multiplicar el elemento 'i') que piden

De todas formas, y corrígeme/me corrijan si me equivoco, pero usar recursividad para recorrer una lista no es muy buena idea porque consumes "mucha" memoria en cada iteración, lo cual no ocurre si lo haces con un bucle

D

#83 Si lo hace(en forma de no multiplicar el elemento i, que para eso pone No divisions are allowed.), mira, te hago un mini-seguiemiento, pero si lo vas haciendo tu entero veras que si sale:

Lo que hay que hacer es esto bi = a1*a2*...*an/ai.

Yo al terminar de "ir en la recursividad" tengo en m a1*a2*...*an, y al volver de reursividad
a bn le asigno a1*a2*...*an-1
.
.
.
a b5 le asigno a1*a2*...*a4
a b4 le asigno a1*a2*...*a3

etc.

Sobre lo que dices sobre la memoria, yo del enunciado lo que entiendo es que no quieren que andes copiando/duplicando el array, no que tenga que ser economico en memoria, de hecho no se como se podria hacer con un bucle y que la complejidad sea O(n).
Si sabes como o tienes la idea comentala, que esta curioso el problema este.

r

#84 El tuyo tiene orden n², si no sería la solución ya que cualquier función recursiva se puede convertir en recursiva de cola, y cualquier función recursiva de cola se puede convertir en iterativa.
(ah, el código anterior está en python, pero se lee muy mal por falta de indentación)

f

#84 Perdona, pero b(i) = a(1) * ... * a(i-1) no es lo que piden... ni para calcularlo te hace falta recursividad ninguna...

f

#83 Aunque calcules c y d en el mismo bucle, estas realizando dos multiplicaciones en cada paso... Por lo tanto el numero de operaciones es 2n, independientemente de que lo hagas en un bucle o en dos...

a

#91 Pues tienes razón, lo había entendido al principio con que recorrías cada array 3 veces, pero ya veo a lo que te referías

Kerensky

#78 #80 No se si acabo de entender qué quiere decir you are allowed to use only constant space. ¿Descartaría eso Arrays auxiliares y/o funciones recursivas?

a

Con #80, #82 y #84:
Para a=:
i=1:
trabajarengoogle (a, b, 1, 1);
b[1] = 1
i=2:
trabajarengoogle (a, b, 2, 2);
b[2] = 2
i=3:
trabajarengoogle (a, b, 8, 3);
b[3] = 8
i=4:
trabajarengoogle (a, b, 48, 4);
b[4] = 48
i=5:
trabajarengoogle (a, b, 384, 5);
b[5] = 384
Resultado final:
b=

Sin embargo, el resultado que debería quedar es:
b=

¿Estoy siguiendo bien tu función o hay algo que se me ha escapado?

Edito: no había visto #92

#85 Yo lo había pensado de forma similar a la tuya, pero claro, el orden de complejidad no es O(n)

#89 Creo que descarta arrays auxiliares, pero no estoy seguro, y la verdad es sin arrays auxiliares no se me ocurre

D

#89
Eso en mi pueblo es usar una cantidad determinada y óptima de vectores, matrices o lo que necesites, reduciendo así el tiempo necesario para resolver el problema.

f

#56 ¿De dónde sacas que recorrer dos arrays tiene complejidad O(n^2)? Querrás decir O(2*n), que es lo mismo que O(n).

f

#56 Ah, perdona, que estás multiplicando una y otra vez... así si sale O(n^2).

PythonMan8

#56 El truco está en ir almacenando los resultados intermedios

a1 * a2
a1 * a2 * a3
...

para no tener que recarculando.

De todas formas que no cuente Google conmigo. Voy a hacer mi propio buscador y se van a enterar. Pondré noticias de Ronaldo, tetas, culos y la crisis y triplicaré las visitas a Google.

t

esta bien saberlo

pedrobotero

tu prefieres ser soplanucas o comealmohadas?

R

La idea de los piratas, por si alguien no lo ha visto es primero hablar con el pirata 5, el de rango mas bajo. Le explicas que no le interesa llegar a estar solo dos piratas, porque el otro se quedaría con todo y no vería nada. En el caso de 3 piratas el pirata 5 tiene que aceptar con una moneda o se queda sin nada. La otra moneda va para el pirata numero 3, para que acepte, ya que si quedan 4 piratas el pirata 2 le da 1 moneda al pirata 4 (que aceptaría porque sabe que de quedar 3 no se lleva nada). Por tanto el beneficio máximo que puede llegar a conseguir el pirata 3 es también de 1 moneda de oro. Y esto es válido para cualquier número de piratas, tienes que dar n-1/2 monedas de oro al resto de piratas (siendo n el numero de piratas, no de monedas) y te puedes quedar con el resto.

Ahora bien, si algun dia tengo que explicar esto a piratas borrachos de grog voy dandome por muerto

antonrodin

De mayoria tengo cierta idea, no es un nivel tan alto como pensais en "SoftEng" la mayoria son de algoritmos bastante conocidos de una asignatura "cancer" de toda facultad "Estructuras de datos y metodos algoritmicos". Una persona recien salida de la carrera podria con la mayoria. Quizas es lo que buscan simplemente. Gente Joven, recien titulados y con un coeficiente altito y que vayan preparadas.

Muchas respuestas podeis encontrar aqui: http://www.casadellibro.com/libro-estructuras-de-datos-y-metodos-algoritmicos/925351/2900000944088

Arvydas

#61, seria ese numero multiplicado por 2, es decir, 18446744073709551616. A no ser que te lo sepas de memoria...es mucho mas elegante la respuesta en binario!

a

A mí se me ocurre para lo del número aleatorio hacer lo siguiente:

- Al resultado que nos de la F5 restarle 1 para que siempre nos de un número de 0 a 4.
- Pensar hacer lo mismo para la F7 para que necesitemos un número de 0 a 6
- Llamar 5 veces seguidas a la F5 y sumar los resultados, por lo que nos va a devolver un número entre 0 y 20
- Hacer módulo 7 el resultados obtenido (tendremos siempre un resultado entre 0 y 6)
- Sumar 1 a ese resultado y ya tenemos el aleatorio

Creo que así existe la misma probabilidad de sacar cualquier de los números, aunque con la pega de que siempre se realiza la llamada a la F5 5 veces, pero creo que no decían nada en contra de hacerlo así

B4rret

#72 Ya, si eso también lo veo yo, pero es que no se me quita de la cabeza que es como una respuesta muy simplona. Por eso pensaba que a lo mejor podía tener trampa... Pero a saber, quizás jueguen también con esto

a

Para ir del punto A al punto B sin estar seguro de que podras llegar:

La respuesta que el entrevistador de de recursos humanos quiere oir es:

-Buscaria un punto A' desde donde si pueda llegar a B.

Es una pregunta que aqui tambien se hace en las empresas.... pero ojo despues te preguntan : ponga un ejemplo de alguna vez que le haya sucedido y haya resuelto llegar a b con exito.

D

#96 no funciona, la idea es mala ya que no hace el calculo que pide, asi que da igual que le meta la condicion de parada...

v

Para el problema de los arrays a_i y b_i, ¿vale con usar logaritmos?

r

Bueno, el de los arrays quedó así, usa un array adicional, mejor no me sale.

def arreglar4(a):
ciclos=0
b=[1 for x in a]
c=[1 for x in a]
largo=len(a)
for i in range(1,largo):
b[i]=a[i-1]*b[i-1]
ciclos+=1
for i in range (largo-1,0,-1):
c[i-1]=a[i]*c[i]
print i
ciclos+=1
print c
for i in range (0,largo):
b[i]*=c[i]
ciclos+=1
print b
print ciclos

Arvydas

una de las "faciles" es cuanto es 2 elevado a 64: un 1 seguido de 64 ceros en binario. Si alguien es capaz de calcularlo en decimal por el mismo y en menos tiempo, para mi es como jesucristo!

antonrodin

#60 Juraria que es del problema famoso de los granos de arroz y el tio que invento el ajedrez...salia la produccion mundial de los ultimos 1000 años o alguna burrada de esas:

P.D: uyyy por poco jejej http://wblog.trota-mundos.com/162/archivo/14/04/2006/fabula-del-emperador-chino-y-el-ajedrez/

en el libro que puse antes, fijate por donde que tambien aparece el problemilla :

B4rret

A mi la que me descoloca mucho es esta :

You are at a party with a friend and 10 people are present including you and the friend. your friend makes you a wager that for every person you find that has the same birthday as you, you get $1; for every person he finds that does not have the same birthday as you, he gets $2. would you accept the wager?

Me recuerda a la paradoja del cumpleaños, solo que esa dice que dos personas cualesquiera tengan el mismo cumpleaños, no que haya otra que tenga el mismo que una persona en concreto...
No acabo de ver donde está la trampa de la pregunta, si es que la hay...

zakrion

#70 Es fácil, no tienes que aceptar. Es muy poco probable que de esas 10 personas haya 1 que cumpla el mismo día que tú, y por eso te llevarías 1€. Sin embargo es muy probable que de esas 10 personas haya más de una que cumpla un día distinto al tuyo, y eso implicaría que tendrías que pagar 2€ por cada una de ellas a tu amigo.

Así que para no perder dinero, de esas 10 personas al menos 7 han de cumplir años el mismo día que tú (recibirías 7€), y las otras 3 cumplen por tanto otro día (tu amigo recibe 6€), con lo cual ganarías 1€.

RamonMercader

las preguntas de ingeniero de software son bastante fáciles la mayoría. Menos las de bases de datos, que aún no he estudiado nada, la inmensa mayoría las se contestar, y sólo estoy en segundo

g

#66 Dudo mucho que 1º de carrera estudiáseis tantos conceptos como para afirmar que las preguntas son fáciles. No todo es quick y mergesort, ¿o es que ya en primero dísteis árboles binarios, montículos, tablas hash...?

f

# Ya tengo cómo hacerlo en O(n). Necesitamos dos arrays adicionales.

c[i]= a(1)*a(2)*...*a(i-1) = c[i-1] * a[i-1]
d[i] = a(i+1)*...a(n-1)a(n) = d[i+1] * a[i+1]

Casos especiales son c(1) y d(n) que valen 1.

Y luego calculamos b(i)=c(i)*d(i).

En total recorremos los arrays 3 veces, luego tenemos O(n).

r

a=[2,5,7,12,57,122]
def arreglar(arreglo):
ciclos=0
b=[1 for x in arreglo]
largo=len(arreglo)
for i in range(largo):
for j in range(largo):
ciclos+=1
if(j!=i):
b[j]*=arreglo[i]
print b
print ciclos
arreglar(a)

A mí me salió así, pero no pude bajar el O(n^2) y por lo que vi ninguna de las soluciones que se plantearon acá lo hace.

D

#85 lo que yo digo en #84, que con un bucle complicada esta la cosa..., yo ando un poco perdido con los ordenes (hace tiempo que no los toco), pero por lo que recuerdo me parece que la solucion que doy yo es O(n), si no es asi, me gustaria que me explicaras porque, ya que te ve puesto en ordenes .

mikibcn

#87 Tu solución es la siguiente:

Procedure trabajarengoogle (var a,b: array of integer ; m,i:integer);
begin
trabajarengoogle (a, b, m*a[i], i+1);
b[i]:= m;
end;

El problema no es que la complejidad del problema no sea O(n), sino que lo que contiene cada elemento de la matriz b no es lo que pide le problema: "bi = a1*a2*...*an/ai".

Por ejemplo, en tu propuesta, la primera posición de b tiene el valor 1, la segunda posición tiene a1, la tercera posición tiene a1 * a2, etc...

D

#84

tienes razon, hay un error, y gordo.
un 0 como un rosco al canto lol

r

#92 Podrías escribirlo de manera que funcione?
Tal como está tu algoritmo no se detiene nunca.

1 2