domingo, 19 de marzo de 2017

Función "siguienteMasGrande" en PHP

No hace mucho tiempo, durante una búsqueda de empleo, se me presento la siguiente prueba técnica:

El desafío es escribir una función "siguienteMasGrande" que toma un entero positivo y devuelve el siguiente entero positivo más grande formado por los dígitos del número original.

En caso que no exista un número más grande debe devolver -1.

Ejemplos:
next_bigger(12)==21
next_bigger(513)==531
next_bigger(2017)==2071
next_bigger(9)==-1
next_bigger(111)==-1
next_bigger(531)==-1
next_bigger(1234)==1243


El tiempo limite eran 3 horas...

Mi enfoque para abordarlo fue el siguiente:


  1. El numero es pasado a la función por el método POST, esta crea un array con el mismo y obtiene todas las permutaciones posibles con las cifras que lo componen.
  2. Esta permutaciones son guardadas en otro array.
  3. Este nuevo array es examinado y se le extraen todas las combinaciones que son mayores al numero original.
  4. A este array con los números mayores, se le extrae el numero mas bajo, que vendría siendo el "Numero Siguiente Mas Grande "
  5. Si el array esta vacio se despliega -1.



Quedo una aplicación bastante buena, :)  

Dejo acá el código fuente por si les es util:



<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // tomamos el valor que viene por el POST desde input.php
    $numero = $_POST["valor"];
}

$proceso = new Proceso();

$array1 = str_split($numero);

$array2 = $proceso->permutar($array1);

$array3 = $proceso->mayorespermuta($array2);

$mensaje = $proceso->mensaje($array3);

// este codigo es para llevar seguimiento de las variables
/*
 * print_r("<br>Valores de array1 ");
 * print_r($array1);
 * print_r("<br>Valores de array2 ");
 * print_r($array2);
 * print_r("<br>valores unicos de array2 ");
 * $tempo= array_unique($array2);
 * print_r($tempo);
 * print_r("<br>valores de array3 ");
 * print_r($array3);
 * print_r("<br>");
 */

// $array1 es el numero original convertido a arreglo
// $array2 son todas las permutaciones del numero original
// $array3 son las permutaciones mayores al numero original
// $resultado es el menor numero en el array de numeros mayores

class Proceso
{
    
    // /***Funcion permutar***///
    public function permutar($array1)
    {
        $array2 = array();
        $cadena = "";
        $temporal = $array1;
        array_shift($array1);
        
        for ($u = 0; $u < count($temporal); $u ++) {
            for ($i = 0; $i < count($array1); $i ++) {
                array_push($array1, $array1[0]);
                array_shift($array1);
                
                for ($e = 0; $e < count($array1); $e ++) {
                    $cadena .= $array1[$e];
                }
                array_push($array2, $temporal[$u] . $cadena);
                array_push($array2, $temporal[$u] . strrev($cadena));
                $cadena = "";
            }
            array_shift($array1);
            array_push($array1, $temporal[$u]);
        }
        return $array2;
    }
    
    // /***funcion permutas mayores al ingresado***///
    public function mayorespermuta($array2)
    {
        $numero = $_POST["valor"];
        // creo el array que va a almacenar todos los numeros mayores al ingresado
        $array3 = array();
        // recorro el array buscando los mayores al ingresado
        $tamanio = count($array2);
        for ($x = 0; $x < $tamanio; $x ++) {
            if ($array2[$x] > $numero) {
                array_push($array3, $array2[$x]);
            }
        }
        return $array3;
    }

    ///***funcion que toma el resultado y lo convierte en mensaje final***///
    public function mensaje($array3)
    {
        if (empty($array3)) {
            $resultado = '-1 ';
        } else {
            $resultado = min($array3);
        }
        $mensaje = "El siguiente numero mayor es: " . $resultado;
        return $mensaje;
    }
}
?>



Pueden descargar la aplicación aqui,  solo copienla en su server php

No hay comentarios:

Publicar un comentario