for循环的PHP超时问题

时间:2019-05-22 00:06:40

标签: php

我正在尝试解决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

1 个答案:

答案 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。始终返回要在函数外部使用的值。