首页 > 解决方案 > 你能算出数字吗?我的代码输出正确但不被接受?

问题描述

我正在研究的问题是:

给你一个数组,代表你拥有的 0、1、2、...、9 的数量。该函数将如下所示:

can_build([#0s, #1s, #2s, ..., #9s], [num1, num2, ...])

如果您可以仅使用您拥有的数字构建以下数字,请编写一个返回 true 的函数。

例子:

canBuild([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3]) ➞ false

我基本上写道:

function canBuild($digits, $arr) {

    if(array_unique($digits) === 0 && $arr === []) {
        return true;
    } elseif ($arr === [] && array_unique($digits) !== 0) {
        return false;
    }

    $result = [];
    $test = [];
    for($i = 0; $i < count($arr); $i++) {
        $test[$i] = str_split($arr[$i]);
    }

    $digit = array_unique($digits);

    $results = [];

    foreach($test as $k => $v) {
        for($j = 0; $j < count($test[$k]); $j++) {
            if(in_array($v[$j], $digit)) {
                array_push($results, "true");
            } else {
                array_push($results, "false");
            }
        }
    }


    if(array_unique($results) === "true") {
        return true;
    } else {
        return false;
    }

}

canBuild([1, 1, 0, 0, 0, 0, 0, 0, 1, 0], [1, 80, 0]); // false

但由于某种原因,我不断收到:“CanBuildNumbersUsingDigits 测试失败:断言 false 为真失败。””有人能看出我的代码有什么问题吗?谢谢。

标签: phpalgorithm

解决方案


查看您的代码:

array_unique($results) === "true" 

array_unique($digits) !== 0

在语义上是不正确的。array_unique()将返回一个数组类型的值,该值永远不会等于任何标量值或字符串,因为您正在进行严格的比较。

此外,您的代码不考虑数字计数,而是检查数组中是否存在数字计数。


解决方案:

要解决此问题,您只需遍历$arr数字数组,str_split将它们转换为单个字符(就像您所做的那样),并从$digits. 如果任何数字计数恰好小于零,这意味着我们没有那么多的数字计数,我们返回,false因为我们不能形成那个数字。如果一切顺利,我们true最终会返回。

function canBuild($digits, $arr) {
    foreach($arr as $num){
        $chars = str_split($num);
        foreach($chars as $char){
            $digits[intval($char)]--;
            if($digits[intval($char)] < 0) return false;
        }
    }
    return true;
}

推荐阅读