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:
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:
- 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.
- Esta permutaciones son guardadas en otro array.
- Este nuevo array es examinado y se le extraen todas las combinaciones que son mayores al numero original.
- A este array con los números mayores, se le extrae el numero mas bajo, que vendría siendo el "Numero Siguiente Mas Grande "
- 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
Publicar un comentario