Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

214
Vistas
¿Cómo deshacerse de la complejidad en el algoritmo?

Ejercicio: Escriba una función múltiple (a, b) que multiplique el número a por el número b sin usar el operador "*" o el método Math.imul.

 multiple(1, 1) // 1 multiple(1, 2) // 2 multiple(0, 0) // 0

Código:

 export default function multiple(a, b) { if (a === Infinity && b === 0 || a === -Infinity && b === 0 || a === 0 && b === Infinity || a === 0 && b === -Infinity) { return NaN; } if (b === Infinity) { if (a < 0) { return -Infinity; } return Infinity; } if (b === -Infinity) { if (a < 0) { return Infinity; } return -Infinity; } if (b === 1 || b === -1) { if (a < 0 && b < 0 || a > 0 && b < 0) { return -a; } return a; } if (b < 0) { return -a + multiple(a, b + 1); } return a + multiple(a, b - 1); }

Ok, escribo este código y pasa las pruebas. Pero eslint se queja de la función de complejidad excesiva: Function 'multiple' has a complexity of 15. Maximum allowed is 10. eslint (complexity)

¿Cómo reducir la complejidad de mi función?

ACTUALIZAR

 const multiple = (a, b) => a / (1 / b);

Sí, realmente funcionó, pero si miro mi código, donde puedo acortar operaciones repetidas, me veo ciego, pero quiero entenderlo.

ACTUALIZAR 2

La solución debe pasar todas las pruebas:

 const random = () => Math.floor(Math.random() * 100) * (Math.random() < 0.5 ? -1 : 1) const cases = [ [0, 1], [1, 0], [1, 1], [1, 2], [0, 0], [5, 5], [5, -5], [290, -41], [-5, 5], [-5, -5], [random(), random()], [random(), random()], [random(), random()], [random(), random()], [random(), random()], [10, -Infinity], [10, Infinity], [-10, Infinity], [-10, -Infinity], [Infinity, 10], [-Infinity, -10], [Infinity, -10], [-Infinity, 10], [0, Infinity], [0, -Infinity], [Infinity, 0], [-Infinity, 0] ] cases.forEach(([a, b]) => { console.log(`\na:${a} b:${b}`) console.log('my:', multiple(a, b), 'Fact:', a * b) })
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Puede reducir la cantidad de pruebas en las que prueba el letrero. En su lugar, podría traducir la llamada con un número negativo a una llamada con un número positivo y negar el resultado.

Aquí hay una versión más compacta.

NB: Supongo que el espíritu del ejercicio era no usar / tampoco, ya que de lo contrario es trivial usar el hecho de que a*b === a/(1/b)

 function multiple(a, b) { return a < b ? multiple(b, a) : b < 0 ? -multiple(a, -b) : a === Infinity ? (b ? a : NaN) : b === Infinity || !b ? b : a + multiple(a, b - 1); } // Tests: const random = () => Math.floor(Math.random() * 200) - 100; const cases = [ [0, 1], [1, 0], [1, 1], [1, 2], [0, 0], [5, 5], [5, -5], [290, -41], [-5, 5], [-5, -5], [random(), random()], [random(), random()], [random(), random()], [random(), random()], [random(), random()], [10, -Infinity], [10, Infinity], [-10, Infinity], [-10, -Infinity], [Infinity, 10], [-Infinity, -10], [Infinity, -10], [-Infinity, 10], [0, Infinity], [0, -Infinity], [Infinity, 0], [-Infinity, 0] ] cases.forEach(([a, b]) => { let result = multiple(a, b); if (!Object.is(result, a*b)) { console.log(`\na:${a} b:${b} my result: ${result}, expected: ${a*b}`); } }) console.log("all done");

about 4 years ago · Juan Pablo Isaza Denunciar

0

Puede usar la identidad |a*b|=exp(ln(|a|) + ln(|b|) o 0 iff a==0 o b==0.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda