找到数组中较小数量元素的计数,则解决方案需要为2n



嗨,我遇到了一个问题,在这个问题中,我必须找出数组中较小元素的数量。我已经实现了我们称之为暴力方法的方法,但这不是优化的解决方案,有人能帮我为下面的代码提供优化解决方案吗

<?php
function find_small_count($arr){
$no_count = []; 
foreach ($arr as $key => $value){
$no_count[$key] = 0;
foreach ($arr as $key1 => $value){
if ($arr[$key1] < $arr[$key]) {
$no_count[$key]++;
}
}
}
return $no_count;
}   
print_r(find_small_count(['8','1','2','2','5']));
?>

预期输出应为[4,0,1,3]

我有三个解决方案。让我来解释

工作代码沙盒

解决方案1

使用array_filter只返回合格的元素,然后对筛选后的数组进行计数以获得计数。

## Solution 1:
function find_small_count($arr)
{
$response = [];
foreach ($arr as $valueToSearch) {
$filtered = array_filter($arr, function ($value) use ($valueToSearch) {
return $value < $valueToSearch;
});
$response[] = ['valueToSearch' => $valueToSearch, 'count' => count($filtered)];

}
return $response;
}
print_r(find_small_count(['8', '1', '2', '2', '5']));

解决方案2

Sort按升序排列。执行此操作时,数组中的所有数字都小于当前元素出现在其前面(数组中(的数字。因此,数组的key将是小于当前值的所有数字的计数,不包括当前数字(键以0开头(。

例外情况是当一个数字出现两次时,如您的案例中的2。如果我们在您的情况下使用key作为count,则first 2将具有count 1,而second 2将具有count 2,这是不正确的。请注意,first 2确实为您提供了正确的计数。

为了避免这种情况,我们可以使用array_unique并删除重复项。这将使你的回答中只有一个2(第一个(,并将给你正确的计数。

你可以考虑一下5。为此,我们可以回退array_unique的行为以保留密钥。因此,即使在array_unique之后,5也将保留其key,即3。我们的目标实现了。唯一的副作用是响应将是[4,0,1,3]而不是[4,0,1,1,3]。所以如果有效的话,你可以使用这个方法。

function find_small_count_two($arr){
$response = [];
sort($arr);
$arrUniqueAndSorted = array_unique($arr);
foreach ($arrUniqueAndSorted as $key => $value){
$response[] = ['valueToSearch' => $value, 'count' => $key];
}
return $response;
}
print_r(find_small_count_two(['8', '1', '2', '2', '5']));

解决方案3

使用array_search。从文档

在数组中搜索给定值,如果成功,则返回第一个对应的键

与解决方案2的逻辑相同,但此解决方案避免了array_unique

function find_small_count_three($arr){
$response = [];
sort($arr);
foreach ($arr as $valueToCount){
$count =array_search($valueToCount, $arr);
$response[] = ['valueToSearch' => $valueToCount, 'count' => $count];
}
return $response;
}

相关内容

最新更新