我正在自己应对一些hackerrank挑战,以提高我的编码和逻辑技能,现在我处于排序部分,我正在尝试解决<<>欺诈活动通知中的挑战strong> PHP
这是摘要: HackerLand国家银行有一个简单的政策,可以警告客户可能存在欺诈性帐户活动。如果客户在特定日期花费的金额连续几天都大于或等于客户的中位数支出,则他们会向客户发送有关潜在欺诈的通知。除非客户至少拥有前几天的交易数据尾数,否则银行不会向客户发送任何通知。
给出培训天数和客户几天的总支出,查找并打印客户整天收到通知的次数。
例如,在前三天内,他们只是收集支出数据。在一天中,我们会跟踪支出的中位数和当天的支出,因为这会引起注意。第二天,我们的尾随支出为,而支出为。这小于,因此不会发送任何通知。在此期间,发送了一封通知。
注意:通过将所有数字从最小到最大排列,可以找到数字列表的中位数。如果数字为奇数,则选择中间的一个。如果数字为偶数,则将中位数定义为两个中间值的平均值。 (维基百科)
功能说明
在下面的编辑器中完成功能activityNotifications。它必须返回一个表示客户端通知数量的整数。
activityNotifications具有以下参数:
支出:代表每日支出的整数数组 d:整数,中位数支出的回溯天数 输入格式
第一行包含两个以空格分隔的整数和,用于计算交易数据的天数,以及用于计算中位数支出的尾随数据天数。 第二行包含以空格分隔的非负整数,其中每个整数表示。
约束
输出格式
打印一个整数,表示客户在几天内收到通知的总次数。
样本输入0
9 5
2 3 4 2 3 6 8 4 5
样本输出0
我们必须确定几天内收到的客户总数。在头五天内,由于银行交易数据不足,客户未收到任何通知:
第六天,银行有几天的先前交易数据和美元。客户花费了美元,这会触发通知,因为:
银行在第七天有几天的先前交易数据和美元。客户花费了美元,这会触发通知,因为:
在第八天,银行有几天的先前交易数据和美元。客户花费了美元,但不会触发通知,原因是:
在第九天,银行拥有几天的先前交易数据和美元交易中间价。客户花费了美元,但不会触发通知,原因是:
样本输入1
5 4
1 2 3 4 4
样本输出 1
需要几天的数据,因此可能要在第一天发出通知。我们的跟踪支出的中位数为客户支出,小于该支出的中位数,因此不发送通知。
到目前为止,我所达到的目标:
<?php
/**
* @param $sorted_list
* @param $d
* @param $median_position
* @return float|int
*/
function getMedian($sorted_list, $d, $median_position) {
$counter = 0;
$left = 0;
while ($counter < $median_position)
{
$counter += $sorted_list[$left];
$left += 1;
}
$right = $left;
$left -= 1;
if ($counter > $median_position || $d % 2 != 0)
{
return $left;
}
else
{
while ($sorted_list[$right] == 0)
{
$right += 1;
}
return ($left / $right) / (2);
}
}
/**
* @param $expenditure
* @param $d
* @return int
*/
function activityNotifications($expenditure, $d) {
$sorted_list = [];
for ($i = 0; $i < $expenditure[0] * 201; $i++) $sorted_list[$i] = 0;
$end = $d;
$current = 0;
$total_notifications = 0;
$median_position = 0;
for ($i =0; $i < count($expenditure); $i++)
{
$sorted_list[$expenditure[$i]] += 1;
}
if ($d % 2 == 0)
{
$median_position = (int) ($d / 2);
}
else
{
$median_position = (int) ($d / 2) + 1;
}
while ($end < count($expenditure))
{
$median = getMedian($sorted_list, $d, $median_position);
if ($expenditure[$end] >= $median*2)
{
$total_notifications += 1;
}
$sorted_list[$expenditure[$current]] -= 1;
$sorted_list[$expenditure[$end]] += 1;
$current += 1;
$end += 1;
}
return $total_notifications;
}
print(activityNotifications([1,2,3,4,4], 4));
在采样输入1上
5 4
1 2 3 4 4
我的输出返回0而不是1,但我仍然没有发现代码出了什么问题,也许我在某个时候误解了问题的解释。
Here the link of Fraudulent Activity Notifications Challenge