【问题标题】:Codility Invalid result type, int expected with PHPCodility 无效的结果类型,PHP 应为 int
【发布时间】:2017-08-07 01:51:41
【问题描述】:

你能告诉我为什么 Codility 告诉我下一个错误吗?

正在运行解决方案...编译成功。

示例测试:[-1, 3, -4, 5, 1, -6, 2, 1] 输出(stderr):无效 结果类型,预期为 int。 RUNTIME ERROR(被测程序终止 没想到)

检测到一些错误。

我的解决方案是用 PHP 编写的。

function solution($A) {
    $N = count($A);
    $Ps = array();
    foreach ( $A  as $KeyP => $P ) {
        $sum = 0;
        if ( $KeyP == 0 ) {                 
            for ( $x = 1; $x < $N; $x++ ) {
                $sum += $A[$x];
            }
            if ( $sum == $P ) {
                $Ps[] = $KeyP;
            }
        }
        else {
            if ( ($KeyP+1) == $N ) {                
                for ( $z = 0; $z < $KeyP; $z++) :
                    $sum += $A[$z];
                endfor;     
                if ( ( $sum >= 0 ) AND ( $sum  < $N ) ) {
                    $Ps[] = $KeyP;
                }   
            }           
            else {      
                $sum1 = 0;
                $sum2 = 0;          
                for ( $z = 0; $z < $KeyP; $z++ ) :
                    $sum1 += $A[$z];
                endfor; 
                for ( $y = ( $KeyP+1 ); $y <= ($N-1); $y++ ) :
                    $sum2 += $A[$y];
                endfor;                             
                if ( $sum1 == $sum2 ) {
                    if ( $sum1 < $N ) {
                        $Ps[] = $KeyP;
                    }
                }
            }   
        }
    }
    return ( count($Ps) <= 0 ) ? -1: $Ps;
}

给定下一个数组,我的函数的输出是:

array(-1, 3, -4, 5, 1, -6, 2, 1);

输出

数组([0] => 1 [1] => 3 [2] => 7)

就像他们在任务中要求我,但 Codility 向我显示所有这些错误。

演示任务如下:

这是一个演示任务。

给出了一个由 N 个整数组成的零索引数组 A。一个 该数组的平衡索引是任何整数 P 使得 0 ≤ P

例如,考虑以下由 N = 8 组成的数组 A 元素:

A[0] => -1   
A[1] =>  3 
A[2] => -4   
A[3] =>  5   
A[4] =>  1   
A[5] => -6   
A[6] =>  2   
A[7] =>  1

P = 1 是这个数组的平衡索引,因为:

A[0] = −1 = A[2] + A[3] + A[4] + A[5] + A[6] + A[7] P = 3 是 这个数组的平衡索引,因为:

A[0] + A[1] + A[2] = −2 = A[4] + A[5] + A[6] + A[7] P = 7 也是 均衡指数,因为:

A[0] + A[1] + A[2] + A[3] + A[4] + A[5] + A[6] = 0 并且没有 索引大于 7 的元素。

P = 8 不是均衡指数,因为它不满足 条件 0 ≤ P

写一个函数:

函数解($A);

给定一个由 N 个整数组成的零索引数组 A,返回 它的任何均衡指数。如果没有,该函数应返回 -1 存在均衡指数。

例如,给定上面显示的数组 A,函数可能返回 1, 3 或 7,如上所述。

假设:

N 是 [0..100,000] 范围内的整数;数组 A 的每个元素 是 [−2,147,483,648..2,147,483,647] 范围内的整数。 复杂性:

预期的最坏情况时间复杂度为 O(N);预期最坏情况空间 复杂度为 O(N),超出输入存储(不计算存储 需要输入参数)。输入数组的元素可以是 修改。

谢谢。

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    对于 Codility 错误,请查看此帖子: https://stackoverflow.com/a/19804284/4369087

    试试这个更具可读性,在这个解决方案中,我通过引入两个函数使代码更具可读性。 sumRight(), sumLeft() 我使用内置的 php 函数。

    array_sum() :计算数组中值的总和: 它以整数或浮点数形式返回值的总和;如果数组为空,则为 0。

    array_slice(): 提取数组的一个切片:array_slice() 返回 数组中的元素序列,由 偏移量和长度参数。

    所以每次我们遍历数组时,我们都会计算从给定位置 $i 开始的数组左右切片的总和:

    <?php
    
    function solution(array $a)
    {
        $result = [];
    
        $count = count($a);
        for($i = 0; $i < $count; $i++) {
            if(sumLeft($a, $i-1) === sumRight($a, $i+1)) {
                $result[] = $i;
            }
        }
    
        return  count($result) ? $result : -1;
    }
    
    function sumRight(array $a, float $position): float
    {
        return array_sum(array_slice($a, $position));;
    }
    
    function sumLeft(array $a, float $position): float
    {
        return array_sum(array_slice($a, 0, $position + 1));
    }
    
    echo "<pre>";
    print_r(solution([-1, 3, -4, 5, 1, -6, 2, 1]));
    

    输出:

    Array
    (
        [0] => 1
        [1] => 3
        [2] => 7
    )
    

    【讨论】:

    • 感谢您的回答,但您的代码可能比我的更易于阅读这一事实并不意味着 Codility 会批准它。实际上,解决方案和输出是相同的,因此,两个代码都给出了相同的错误。 :( 问候。
    • 不客气@FernandoUrban,哪个 php 版本给出了错误?
    • 在 Codility 想要 PHP7。
    • 一些类型提示怎么样,我改变了我的代码,你能再试一次吗
    • $i = 0; $count = count($a), 更改为 $i = 0, $count = count($a); 以便缓存而不是在每次迭代时调用。只是交换分号和逗号的问题。当您确定 OP 的答案时,请附上解释。
    【解决方案2】:

    磁带平衡问题的措辞非常混乱。

    • P 是数组 $A 的值
    • P 值必须大于 0 且小于 N
    • N 是数组 $A 中的索引总数
    • $A 是一个由 N 个整数组成的非空数组

    “0

    我的看法是解释措辞不当。然而,这个例子很清楚,所以如果你能通过开头的文字,解决方案就相对简单了。

    给定一个由 N 个整数组成的非空数组 A。数组 A 代表磁带上的数字。 任何整数 P,如 0

    两部分的区别在于:|(A[0] + A[1] + ... + A[P - 1]) - (A[P] + A[P + 1] + ... + A[N - 1])|

    换句话说,它是总和之间的绝对差 第一部分和第二部分的总和。

    最初难倒我的部分是我为错误的数组输入返回 NULL,并收到一个 Codility 错误,即当它期待一个 INT 时返回了 NULL。我想,当坏数据没有解决方案时,我怎么能返回一个 INT 呢?原来,他们希望你返回一个零。

    这是我的 100/100 PHP 解决方案:

    function solution($A) {
        if ( empty($A) ) {
            return 0;
        }
        
        $count = count($A);
        
        if ($count == 1) {
            return $A[0];
        }
        
        for ($i=0, $max_position = $count - 1; $i<$max_position; $i++) {
            if (!is_int($A[$i])) {
                return;
            }
    
            if ($i == 0) {
                $left = $A[0];
                $right = array_sum($A) - $left;
            
                $min = abs($left - $right);
            }
            else {
                $left += $A[$i];
                $right -= $A[$i];
    
                $min = min([$min, abs($left - $right)]);   
            }
        }
    
        return $min;
    }
    

    需要注意的三件事。

    1. 如果 $A 为空,则返回一个整数 (0),因为 NULL 会导致 代码错误
    2. 如果 $A 只有一个索引,则返回一个整数 (0),因为您无法将单个索引拆分为他们想要的两个相等的部分,并且 NULL 会导致代码错误
    3. 显然,无效的非整数值没有经过测试 - 你可以看到我在哪里检查了 !is_int($A[$i]) 然后是“return;”那 应该导致 NULL (并且关于 NULL 的错误不是 是一个 int),但我没有。

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2011-03-24
      • 1970-01-01
      • 2010-09-26
      • 2012-09-07
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      相关资源
      最近更新 更多