второй по величине массив форм абсолютных значений в переполнении стека

второй по величине массив форм абсолютных значений

вход: массив (13, -12, 8, 2, 5)

Ожидаемый ответ: 12

вот мой код

<?php
function print2largest($arr, $arr_size)
{
if ($arr_size < 2)
{
echo(" Invalid Input ");
return;
}
$first = $second = PHP_INT_MIN;
for ($i = 0; $i < $arr_size ; $i++)
{
if ($arr[$i] > $first)
{
$second = $first;
$first = $arr[$i];
}

else if ($arr[$i] > $second &&
$arr[$i] != $first)
$second = $arr[$i];
}
if ($second == PHP_INT_MIN)
echo("There is no second largest element\n");
else
echo("The second largest element is " . $second . "\n");
}
$arr = array(13, -12, 8, 2, 5);
$n = sizeof($arr);
print2largest($arr, $n);
?>

выходной я получил: 8

3

Решение

Это легко сделать «php-way»:

$arr = array(13, -12, 8, 2, 5);
$absoluteArr = array_map('abs', array_unique($arr));
rsort($absoluteArr);
echo $absoluteArr[1];
12

Другие решения

Не нужно делать столько кода, делайте напрямую:

<?php

$array  = array(13, -12, 8, 2, 5);
$final_array = array_unique(array_map('abs',$array)); // remove duplicates and apply abs() to all elements
rsort($final_array,SORT_NUMERIC); //reverse sort array numerically

echo $final_array[1]; //get second highest

Выход:-https://3v4l.org/mgjaO

Ссылка:-

абс ()

array_map ()

array_unique ()

rsort ()

2

Я не уверен, что для этого нужна функция, если вы просто rsort массив после каждого элемента был обновлен с абсолютный значение с array_mapи посмотрите на вторую позицию:

function print2largest($arr) {
if (count($arr) < 2) {
echo(" Invalid Input ");
return;
}

$arr = array_map("abs", $arr);
rsort($arr);
return $arr[1];
}

$arr = array(13, -11, 9, 2, 5);
print2largest($arr);
0

Просто добавьте abs () к значениям здесь

function print2largest($arr, $arr_size)
{
if ($arr_size < 2)
{
echo(" Invalid Input ");
return;
}

$first = $second = PHP_INT_MIN;
for ($i = 0; $i < $arr_size ; $i++)
{
if (abs($arr[$i]) > $first)
{
$second = $first;
$first = abs($arr[$i]);
}

else if (abs($arr[$i]) > $second &&
abs($arr[$i]) != $first)
$second = abs($arr[$i]);
}
if ($second == PHP_INT_MIN)
echo("There is no second largest elementn");
else
echo("The second largest element is " . $second . "n");
}

$arr = array(13, -12, 8, 2, 5);
$n = sizeof($arr);
print2largest($arr, $n);

Второй по величине элемент — 12n

0
$array = [13, -12, 8, 2, 5];
echo getSecondLargestAbsolute($array); // 12

function getSecondLargestAbsolute($array)
{
$values = [];
if (count($array) == count($array, COUNT_RECURSIVE)) {
$values = $array;
} else {
foreach (new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array)) as $item) {
$values[] = $item;
};
}

array_walk($values, function (&$val){
return $val = abs($val);
});

rsort($values);

return $values[1];
}
0