Do not speak Portuguese? Translate this site with Google or Bing Translator
Script PHP - Encontrar numero mais proximo do Zero

Posted on: September 17, 2021 11:20 AM

Posted by: Renato

Categories: PHP

Views: 618

Como encontrar o valor mais próximo de zero em uma matriz com números positivos e negativos em PHP
 

Nos últimos dias, precisei preencher um teste de codingame que expôs o seguinte problema que precisava ser resolvido:

Hot Codingame

Neste exercício, você deve analisar os registros de temperatura para encontrar o mais próximo de zero. Temperaturas da amostra. Aqui, -1,7 é o mais próximo de 0. Implemente a função  closestToZeropara retornar a temperatura mais próxima de zero que pertence ao array ts.

  • Se tsestiver vazio, retorna 0 (zero).
  • Se dois números forem tão próximos de zero, considere o número positivo como o mais próximo de zero (por exemplo, se tscontiver -5 e 5, retorne 5).
Entrada:
  • As temperaturas são sempre expressas com números de ponto flutuante variando de -273 a 5526.
  • tsé sempre uma matriz válida e nunca é  null.

Solução

Com base nos dados expostos, a seguinte implementação resolve o problema:

<?php

/**
 * From a collection of numbers inside an array, returns the closest value to zero.
 */
function computeClosestToZero(array $ts) {
    if(empty($ts)){
        return 0;
    }
    
    $closest = 0;
    
    for ($i = 0; $i < count($ts) ; $i++) {
        if ($closest === 0) {
            $closest = $ts[$i];
        } else if ($ts[$i] > 0 && $ts[$i] <= abs($closest)) {
            $closest = $ts[$i];
        } else if ($ts[$i] < 0 && -$ts[$i] < abs($closest)) {
            $closest = $ts[$i];
        }
    }
    
    return $closest;
}

Você pode testar o código com diferentes exemplos de sua preferência:

$ts = [7,-10, 13, 8, 4, -7.2,-12,-3.7,3.5,-9.6, 6.5,-1.7, -6.2,7];
// Result: -1.7
echo "Result: " . computeClosestToZero($ts);

$ts = [5, 6, 7, 9 , 2, - 2];
// Result: 2
echo "Result: " . computeClosestToZero($ts);

$ts = [];
// Result: 0
echo "Result: " . computeClosestToZero($ts);

Alternativamente, uma das soluções da comunidade inclui também esta outra opção:

<?php

function closestToZero(array $ts)
{
    if (count($ts) === 0) return 0;
    
    $closest = $ts[0];

    foreach ($ts as $d) 
    {
        $absD = abs($d);
        $absClosest = abs($closest);
        if ($absD < $absClosest) 
        {
            $closest = $d;
        } 
        else if ($absD === $absClosest && $closest < 0) 
        {
            $closest = $d;
        }
    }
    
    return $closest;
}

Isso é bom, mas o problema é -2 e 2 são igualmente próximos de zero, mas o resultado com esse código retorna apenas o positivo. O código no snippet a seguir compara o positivo e o negativo e fornece os dois valores se forem iguais.

<?php

/**
* From a collection of numbers inside an array, returns the closest value to zero.
*/
function computeClosestToZero(array $ts) {
if(empty($ts)){
return 0;
}
 
$closestpos = 0;
$closestmin = 0;
$return = 0;
 
for ($i = 0; $i < count($ts) ; $i++) {
if ($ts[$i] > 0) {
if($closestpos === 0) {
$closestpos = $ts[$i];
} else if ($ts[$i] <= abs($closestpos)) {
$closestpos = $ts[$i];
}
} else if ($ts[$i] < 0) {
if($closestmin ===0){
$closestmin = $ts[$i];
} else if(-$ts[$i] < abs($closestmin)) {
$closestmin = $ts[$i];
}
} else if($ts[$i] === 0) {
return 0;
}

if ($closestpos - ($closestpos * 2) == $closestmin){
$return = 'positivo = '.$closestpos.' minus = '.$closestmin;
} else {
if($closestpos < abs($closestmin)){
$return = $closestpos;
} else {
$return = $closestmin;
}
}
 
}
//echo $closest;
return $return;
}

$ts = [7,-10, 13, 8, 4, -7,-12,-3,3,-9, 6,-1, -6,7];

echo "Result: " . computeClosestToZero($ts);
 

Boa codificação !


3

Share
About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (12) Variados (109) PHP (108) Laravel (116) Black Hat (3) front-end (25) linux (86) postgresql (35) Docker (14) rest (4) soap (1) webservice (6) October (1) CMS (2) node (7) backend (10) ubuntu (41) devops (22) nodejs (5) npm (2) nvm (1) git (4) firefox (1) react (6) reactnative (5) collections (1) javascript (5) reactjs (7) yarn (0) adb (1) solid (0) blade (2) models (1) controllers (0) log (0) html (2) hardware (2) aws (14) Transcribe (2) transcription (1) google (3) ibm (1) nuance (1) PHP Swoole (4) mysql (22) macox (2) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (2) imagick (2) ec2 (1) sw (1) websocket (1) markdown (1) ckeditor (1) tecnologia (13) faceapp (1) eloquent (11) query (2) sql (35) ddd (3) nginx (6) apache (4) certbot (1) lets-encrypt (2) debian (9) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (1) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (2) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (1) binaural (1) mysqli (3) database (33) windows (2) vala (1) json (2) oracle (1) mariadb (2) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (1) piada (1) cron (2) dba (13) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (3) bash (2) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (0) biologia (1) programming (20) performance (2) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (1) microg (1) iode (1) ssh (1) zsh (1) terminal (1) dracula (1) spaceship (1) mac (1) idiomas (1) laptop (1) developer (27) api (1) data (1) matematica (1) seguranca (2) 100DaysOfCode (6) hotfix (1) documentation (1) laravel (2) RabbitMQ (1) Elasticsearch (1) redis (1) Raspberry (3) Padrao de design (4) JQuery (1) angularjs (2) Dicas (12) kubenetes (1) vscode (1) backup (1) angular (1) servers (2) pipelines (1) AppSec (1) DevSecOps (2) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (1) jwt (1) security (1) translate (1) kube (1) iot (1) politica (1) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (2) traefik (1) networking (1) host (1) POO (1) microservices (1) bug (1) cqrs (1) arquitetura (1) Architecture (1)

New Articles



Get Latest Updates by Email