在军队中,每个士兵都有一个指定的军衔。 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;
}
答案 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
答案 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.