Dada la matriz ["1510", "1518", "1520", "1523", "1530", "1483", "1485"] Salida esperada: -

Smallest - 1510
Largest - 1530

Otra matriz ["310", "314", "320", "319", "323", "313", "330"] Salida esperada: -

Smallest - 310
Largest - 330

Mi código a continuación obtiene el valor mínimo y el valor máximo que tiene problemas con la solución del primer problema que figura anteriormente, ya que está devolviendo 1483 como más pequeño y 1485 como el más grande. La diferencia entre MAX y MIN debería ser más grande.

¿Alguna idea de cómo conseguir eso?

function minMax(array) {
    if(array.length <= 0) return [0, 0];
    let max = Math.max.apply(null, array);
    let min = Math.min.apply(null, array);
    let max_index = array.lastIndexOf(String(max));
    let min_index = array.indexOf(String(min));
    if(min_index >= max_index) {
        array.splice(max_index, 1);
        [min, max] = minMax(array);
    }
    return [min, max];
}
0
Kailash Prabhu 29 may. 2021 a las 10:58

4 respuestas

La mejor respuesta

Un solo paso sobre la matriz:

  1. Iterar desde el final de la matriz hasta el principio.
  2. Mantenga un registro de MAX y MIN, así como la lista de pares MIN / MAX
  3. Compruebe cada elemento
    • Si el artículo encontrado es más que el máximo actual,
      • Añadir Min / Max actual a la lista de pares
      • Haz que el elemento actual sea el máximo y reinicie el MIN
    • de lo contrario, si el artículo actual es menor que el mínimo actual, hazlo el mínimo.
    • de lo contrario no hagas nada.
  4. Posteriormente, agregue el último par min / max a la lista.

En este punto, tiene una lista de pares Min / Max potenciales para regresar. Tienes que revisarlos desde el final hasta el principio para encontrar el primero donde el mínimo se configura y la devuelva. O devolver un conjunto predeterminado de MIN / MAX.

function minMax(arr) {
  let max = -Infinity;
  let min = Infinity;
  const candidates = [];
  for (let i = arr.length-1; i >= 0; i--) {
    const item = Number(arr[i]);
    if (item > max) {
      candidates.push([min, max]);
      max = item;
      min = Infinity;
    } else if (item < min) {
      min = item;
    }
  }
  candidates.push([min, max]);

  // Instead of return fixed first or last element below code would return first element from last which is finite.
  for(let i = candidates.length - 1; i >= 0; i--) {
      if(Number.isFinite(candidates[i][0])) return candidates[i];
   }
   return [0, 0];
}
console.log(minMax(["1510", "1518", "1520", "1523", "1530", "1483", "1485"]));
console.log(minMax(["310", "314", "320", "319", "323", "313", "330"]));
console.log(minMax(["350", "314", "320", "319", "323", "313", "330"]));
console.log(minMax(["7", "6", "1", "2"]));
console.log(minMax(["4", "3", "2", "1"]));
0
VLAZ 29 may. 2021 a las 13:24

Puedes usar algo como abajo

function minMax(array) {
    let max = Math.max.apply(null,array)
    let newArray= array.slice(0,array.indexOf(+max)-1)
    let min=Math.min.apply(null, newArray);
    return [min, max];
}
0
VLAZ 29 may. 2021 a las 08:18

Tú podrías

  • Tome una variedad de valores locales y máximos,
  • agruparlos a pares Mín y máx, si existen ambos valores,
  • Cambie el valor máximo si se encuentra uno en los índices mayores,
  • Consigue el pareja con delta más grande.
function minMax(numbers) {
    return numbers
        .reduce((r, v, i, a) => {
            if (!(r.length & 1) === a[i - 1] < v) r[r.length - 1] = v;
            else r.push(v);
            return r;
        }, [])
        .reduce((r, v, i, a) => {
            if (i & 1) r.push([a[i - 1], v]);
            return r;
        }, [])
        .reduce((r, [min, max], i, a) => (r || a).map(([left, right], j) => [
            left,
            i > j && max > right ? max : right
        ]), undefined)
        .reduce((a, b) => a[1] - a[0] >= b[1] - b[0] ? a : b);

}

console.log(minMax([1510, 1518, 1520, 1523, 1530, 1483, 1485])); // 1510 1530
console.log(minMax([310, 314, 320, 319, 323, 313, 330]));        //  310  330
console.log(minMax([9, 3, 4, 1]));                               //    3    4
.as-console-wrapper { max-height: 100% !important; top: 0; }
0
Nina Scholz 29 may. 2021 a las 10:15

Este problema es el mismo que comprar y vender stock . Primero necesitas comprar stock y vender para máximo posible. Por lo tanto, en cada índice, necesita conocer el elemento más grande en el lado derecho.

  1. Arreglo transversal desde el final, y en cada tienda índice, el elemento máximo hasta ahora. For the list [1510, 1518, 1520, 1523, 1530, 1483, 1485] maxList will look like [1530, 1530, 1530, 1530, 1530, 1485, 1485] difference [20, 12, 10, 7, 0, 2, 0 ] so answer will be 1510 and 1530.
0
Kranthi Kumar 29 may. 2021 a las 10:28