我正在尝试解决PHP问题,在某些情况下,我所做的工作确实可行,但是对于较大的值和数据集,由于超时而失败。我需要帮助来确定可以解决的方法。
我正在进一步开发PHP知识,这个问题来自我一直在使用的测试站点。问题本质上是有两个人在一起花在冰淇淋上的钱总计。有一系列风味,$ cost,每个风味用一个整数表示,即风味的成本。需要找到与美元金额正好相等的两种风味,并显示这两个数字,而不是成本,而是风味的数量。这个问题总是有一个独特的解决方案。
我已经过滤掉了,这样花费超过自己钱数的调味品甚至都不会被检查...并且在找到解决方案后检查就停止了。
<?php
function whatFlavors($cost, $money) {
$num_flavors = count($cost);
$select_flavors = array(0);
for ($i = 0; $i < $num_flavors; $i++) {
if (($cost[$i] < $money) && ($select_flavors[0] == '0')) {
for ($j = 1; $j < $num_flavors; $j++) {
if ($cost[$j] < $money) {
if ($cost[$i] + $cost[$j] == $money) {
$select_flavors[0] = $i+1;
$select_flavors[1] = $j+1;
break;
} else {
$break;
}
}
}
}
}
sort($select_flavors);
echo $select_flavors[0]." ".$select_flavors[1]."\n";
}
?>
要使用测试用例运行代码,请使用:
$stdin = fopen("php://stdin", "r");
fscanf($stdin, "%d\n", $t);
for ($t_itr = 0; $t_itr < $t; $t_itr++) {
fscanf($stdin, "%d\n", $money);
fscanf($stdin, "%d\n", $n);
fscanf($stdin, "%[^\n]", $cost_temp);
$cost = array_map('intval', preg_split('/ /', $cost_temp, -1, PREG_SPLIT_NO_EMPTY));
whatFlavors($cost, $money);
}
fclose($stdin);
测试输入详细信息: -第一行是包含多少测试 -第二行是要花费多少钱 -第三行是包含多少种口味 -第四行是用空格隔开的各种口味,每种口味均用其成本表示
确实有效的示例测试用例:
2 4 5 1 4 5 3 2 4 4 2 2 4 3
超时的测试用例:
由测试网站提供,无法粘贴到此处,因此您可以从此链接中获取文本文件... https://app.box.com/s/ka01xpigqmvcjflcv0bl9760svdb78vd
答案 0 :(得分:1)
因此,您正在寻找两个加起来等于一定数目的数组元素?您正在指数遍历数组中的每个元素,所以难怪您会超时。
您只需要一个循环即可遍历数组。在每次迭代中,简单的减法都会告诉您要寻找的值。只需使用标准的array_search
来查找它。一旦找到一对,就可以停止寻找。
<?php
function whatFlavours($cost, $money) {
foreach ($cost as $i=>$v) {
$j = array_search($money - $v, $cost);
if ($j !== false) {
return [$i, $j];
}
}
return [0, 0];
}
$cost = [23, 53, 13, 46, 11, 8, 27, 4];
$money = 24;
$result = whatFlavours($cost, $money);
echo "$result[0] $result[1]";
输出:
2 4
即13 + 11。
此外,您绝对不要从函数中echo
。始终返回要在函数外部使用的值。