首页 > 解决方案 > 我构建的 PHP 代码并不能适用于所有场景,它有什么问题?

问题描述

我正在尝试解决以下问题:

给定一个整数序列作为数组,确定是否可以通过从数组中删除不超过一个元素来获得严格递增的序列。

注意:如果 a0 < a1 < ... < an,则序列 a0, a1, ..., an 被认为是严格递增的。仅包含一个元素的序列也被认为是严格递增的。

例子

对于 sequence = [1, 3, 2, 1],输出应该是几乎IncreasingSequence(sequence) = false。

这个数组中没有一个元素可以被删除以获得严格递增的序列。

对于 sequence = [1, 3, 2],输出应该是几乎IncreasingSequence(sequence) = true。

您可以从数组中删除 3 以获得严格递增的序列 [1, 2]。或者,您可以删除 2 以获得严格递增的序列 [1, 3]。

下面是我的代码:

function almostIncreasingSequence($sequence) {
    $count = count($sequence);
    $oldSeq = $sequence;
    sort($sequence);
    $key = 0;
    foreach ($oldSeq as $s) {
        $seq = $oldSeq;
        unset($seq[$key]);
        $changed_sec = $seq;
        sort($seq);
        if ($seq==$changed_sec) {
            $unique = array_unique($seq);
            if ($seq!=$unique) {
                $key++;
                if ($key==$count) {
                    return false;
                }
                continue;
            } else {
                return true; 
                break;
            }
        } else {
            $key++;
            if ($key==$count) {
                return false;
            }
            continue;
        }
    } 
}

请注意,总的来说,我在编程方面非常初学者,而且我知道肯定有比使用我的代码更短、更简单的方法来让它正确。我会很感激任何关于实现相同目标的更简单和更简单的方法的注释,但是我的主要关注点是我创建的当前代码有什么问题。

标签: php

解决方案


我相信您的代码中的问题是数组相等。

为了在 PHP 中将 2 个数组视为相等,两个数组应具有相同的键和值。

但是,在您的代码中,您使用的是unset,它不会重置数组的键。例如:

php > $a = [1,2,3];
php > print_r($a);
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
php > unset($a[0]);
php > print_r($a);
Array
(
    [1] => 2
    [2] => 3
)

因此,如果您有一个变量$b = [ 2, 3 ],那么$a == $b将是false.

解决此问题的最简单方法是使用array_values,它会重置数组的索引。

所以,回到$a之前的数组:

php > print_r($a);
Array
(
    [1] => 2
    [2] => 3
)
php > print_r(array_values($a));
Array
(
    [0] => 2
    [1] => 3
)

所以现在,如果你有$b = [ 2, 3 ],那array_values($a) == $b就是true


推荐阅读