获取报告士兵的数量

时间:2019-06-09 08:14:12

标签: php codeigniter

在军队中,每个士兵都有一个指定的军衔。 X级士兵必须向X + 1级士兵(任何)报告。许多士兵可以向同一上级报告。写一个函数:给定一个由行列组成的行列,返回可以报告给上级的士兵人数。 例子:

1)给定等级= [3,4,3,0,2,2,3,0,0]应该返回5

2)给定排名= [4,2,0]应返回0,

3)给定等级= [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;
}

6 个答案:

答案 0 :(得分:1)

如果我们使用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

答案 1 :(得分:0)

代码的逻辑并不难。

主要规则是,排名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级士兵仅向其中之一报告)

因此,基本算法应考虑这三个规则。 您可以编写代码,如果有任何问题,我们可能会帮助您!

答案 2 :(得分:0)

好吧,我想我现在已经明白了:

$count = 0;
foreach($array as $k => $v)
{
    if(in_array(($v + 1), $array))
    {
        $count++;
    }
}

答案 3 :(得分:0)

已检查以下情况

$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;
}

答案 4 :(得分:0)

我对一项在线测试也有同样的疑问,我正在用Javascript编写代码。

function solution(ranks, callback) {
  var sortedArray = ranks.sort((a, b) => a - b);
  var reportingSoldier = 0;
  for (var i = 0; i < ranks.length; i++) {
    if (ranks.includes(ranks[i] + 1)) {
      reportingSoldier++;
    }
  }
  return callback(null, reportingSoldier);
}

var inputRanks = [3, 4, 3, 0, 2, 2, 3, 0, 0];
solution(inputRanks, function(err, result) {
  if (err) {
    console.error(err);
  } else {
    console.log('>> Ranks : ', result); // 5
  }
});

答案 5 :(得分:0)

在一个在线测试中提出了这个问题: 我们需要阅读以下内容以更清楚地理解该问题:

1)给定军衔= [3,4,3,0,2,2,3,0,0] sholud return 5因为-> 3名三级士兵向4级军人报告-> 2名士兵等级2向等级3的任何士兵报告2)给定等级= [4,2,0]应该返回0,3)给定等级= [4,4,3,3,1,0]您的函数应该返回3。因为->等级0的士兵可以向等级1的士兵报告。->等级3的两个士兵可以向等级4的任何士兵报告。

c#中的解决方案:

public static void Main(string[] args)
        {            
            int rank = 0;
            char [] ch = {'3','4','3','0','2','2','3','0','0'};
            //char [] ch = {'4','2','0'};
            //char [] ch = {'4','4','3','3','1','0'};
            string input = new string(ch);             
            Array.Sort(ch);            
            for(int i =0 ; i<ch.Length; i++)
            {
                for(int j =i ; j<ch.Length-1; j++)
                {
                    if((ch[i] - 48 + 1) == (ch[j+1] - 48 ))
                    {
                        rank++;
                        break;
                    }
                }
            }
            Console.WriteLine(rank.ToString());
        }

This work perfectly well.