получить номер сообщающего солдата - PullRequest
0 голосов
/ 09 июня 2019

В армии каждому солдату присвоено звание. Солдат ранга X должен сообщить (любому) солдату ранга X + 1. Многие солдаты могут подчиняться одному и тому же начальнику. Напишите функцию: при наличии массива рангов, состоящих из рангов, возвращается число солдат, которые могут подчиниться какому-нибудь начальнику. Примеры:

1) С учетом рангов = [3,4,3,0,2,2,3,0,0] должно возвращаться 5

2) Учитывая, что ранги = [4,2,0] должны вернуть 0,

3) Учитывая Ranks = [4,4,3,3,1,0], ваша функция должна вернуть 3

function get_reporting_rank($ranks){
    $len = count($ranks);
sort($ranks);
$reporting_soldier = 0;
$i = 0;
$pre_rank = -1;
$next_superior_reporting = 0;
foreach($ranks as $rank){
    $upper = $rank+ 1;
        if(in_array ( $upper, $ranks ,TRUE )){
            if ($i !== $len ) {
                $reporting_soldier = $reporting_soldier+1;
            } 
        } 
    $i++;
}
echo "<h1>Reporting :".$reporting_soldier;
}

Ответы [ 4 ]

1 голос
/ 09 июня 2019

Если мы зациклим счетчик каждого ранга, используя array_count_values, чтобы получить счетчик, мы увидим, есть ли выше ранг с помощью in_array.

$arr = [3,4,3,0,2,2,3,0,0];

$counts = array_count_values($arr);
// creates an associative array with the counts of each rank. 
//The key is the rank and the value is the count of people with the given rank
/*$counts:
Array
(
    [3] => 3
    [4] => 1
    [0] => 3
    [2] => 2
)*/


$res = 0;
foreach($counts as $rank => $count){
    //See if there are any above in the rank chain, if yes add the count to the result
    if(in_array($rank+1, $arr)) $res += $count;
}
echo $res; // 5

https://3v4l.org/1MpfO

0 голосов
/ 09 июня 2019

Хорошо, я понимаю, что теперь понимаю:

$count = 0;
foreach($array as $k => $v)
{
    if(in_array(($v + 1), $array))
    {
        $count++;
    }
}
0 голосов
/ 09 июня 2019

проверено по следующему сценарию

$ranks = [3,4,3,0,2,2,3,0,0]; // 5
$ranks = [11,10,10,10,10,8,8,7,6,4,4,4,4,4,3,3,3,3,3,1,0]; //12
$ranks = [4, 3,1,0,0,0];  //4
$ranks = [4, 4, 3, 3, 1, 0] ; // 3
$ranks =   [4, 2, 0] ; // 0
get_reporting_rank($ranks);
    function get_reporting_rank($ranks){
        $len = count($ranks);
        sort($ranks);
        $reporting_soldier = 0;
        $i = 0;

        $next_superior_reporting = 0;
        foreach($ranks as $rank){
            $upper = $rank+ 1;
            if(in_array ( $upper, $ranks ,TRUE )){
            if ($i !== $len) {
                $reporting_soldier = $reporting_soldier+1;
            }
        }
    $i++;
}
    echo "<h1>Reporting :".$reporting_soldier;
}
0 голосов
/ 09 июня 2019

Логика для кода не очень сложная.

Основное правило заключается в том, что солдат ранга X может сообщать только солдату ранга X + 1 Итак, первое, что вы должны найти, это посмотреть, есть ли в массиве последовательные числа или нет (во втором примере [4,2,0] нет последовательных чисел, поэтому никто не может отчитаться ни перед кем),

Вторым важным моментом является то, что любое количество солдат может сообщить другому солдату (например, один [3,4,3,0,2,2,3,0,0], все три солдата 3 ранга могут сообщить одному Солдат 4 ранга)

третье правило в соответствии с вашим примером состоит в том, что каждый солдат сообщает только один раз одному солдату более высокого ранга (пример три [4,4,3,3,1,0], хотя есть два солдата с 4 рангами и 3 солдата с рангами) сообщить только одному из них)

Таким образом, основной алгоритм должен учитывать эти три правила. Вы можете написать свой код, и если у вас возникли проблемы, мы можем вам помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...