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

Comentarios

Entradas populares de este blog

Hoja de ayuda para Twilight Imperium (third edition)

Objetivos tácticos warhammer 40.000

Proyecto Mesa de juegos