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