【问题标题】:Algo Issue - Find a group of item in a list算法问题 - 在列表中查找一组项目
【发布时间】:2014-09-19 18:09:03
【问题描述】:

这是我想要做的:

我有 2 个列表。

列表 1:00F0001,00F0002,00F0003,00F0004,00F0005,00F0006,00F0007,00F0008,00F0009,00F0010

List 2 : 00F0006,00F0007,00F0008(此列表由第一项($debut)和最后一项($fin)生成)

我想做的是:

如果“列表 2”在“列表 1”中,则返回 true,仅此而已。

所以我尝试了 2 for 但我被阻止了:/

我的代码:

    $id = substr($debut,0,4);
    echo '</br>id : '.$id; /* = 00F0*/

    $Start = substr($debut,4,25);
    $End = substr($fin,4,25);
    $range = $End - $Start +1;

    echo '</br>Range : '.$range; /* = 3 with the example I gave*/

    for ($i = 0;$i < $range;$i++){
        $indice2 = $Start + $i;
        $Num_Serie = str_pad($indice2, 4, '0', STR_PAD_LEFT);
        $Num_Serie_Final[$i] = $id.''.$Num_Serie;
    }
    $ArrayNS = $Num_Serie_Final;
$i_W = 0;
while(($produit = $reponse->fetch())AND($check3 == "false")){

    $ArrayProduit[$i_W] = $produit[1];
    $i_W++;
    }

for ($i2 = 0; $i2 < $i_W; $i2++){
    for ($i3 = 0; $i3 < $range; $i3++){
        if ($ArrayNS[$i2] == $ArrayProduit[$i3]){
          .... ???? .....
        }
    }
}

第一个“for”是构建我的“List 2”。 “while”循环是生成我的“List 1”

然后我做了一个双“for”循环,但在这里我锁定了:/

编辑

我为感兴趣的人尝试了一些东西:

    for ($i3 = 0; $i3 < $range; $i3++){
    for ($i2 = 0; $i2 < $i_W; $i2++){
        if ($ArrayNS[$i3] == $ArrayProduit[$i2]){
            for ($indice=0; $indice < $range; $indice++){
                if ($ArrayNS[$indice] == $ArrayProduit[$i2+$indice]){
                    $ok = true;
                    echo '$ArrayNS[$indice] : '.$ArrayNS[$indice].'   ==   $ArrayProduit[$i2+$indice] : '.$ArrayProduit[$i2+$indice].'</br>';
                }
                else {
                    $ok = false;
                    $id_erreur = $ArrayNS[$indice];
                    echo 'Fail with : '.$ArrayNS[$indice].'   !==   '.$ArrayProduit[$i2+$indice].'</br>';
                }
            }
            if ($ok) {
                echo 'Success !!!';
                return ($ok);
            }
            else {
                echo 'Fail !!!';
                return ($id_erreur);
            }
        }
    }
}

可能不是最好的方法,但它确实有效^^

【问题讨论】:

  • 不检查是否相等,而是检查是否不相等,如果不匹配则跳出内部循环。使用标志来确定您是中断还是完成了内部循环。在外循环内,内循环后,检查标志是否成功。

标签: arrays algorithm loops for-loop while-loop


【解决方案1】:

为了控制台可测性我选择了js,但是算法在php中是一样的

这个返回一个索引,但你只需要检查你的索引是否与-1不同就可以判断它是否被发现。

这个想法是循环遍历干草堆的每个元素(此处为l1),如果当前元素与我们针的第一个元素(l2)匹配,那么我们开始从当前干草堆索引(@987654324 @) 到我们的指针索引 (i + j) 的末尾,但是如果这些元素中的任何一个不匹配(在第一次出现时),我们会跳到干草堆的下一个值 (l1) 并重试。如果我们没有失败(failedMatch 标志),则返回子序列的索引(l2l1 开始位置)。

如果子序列没有出现在大海捞针中,我们按照约定返回-1

这是从左到右的方法,所以它只会匹配第一次出现的子序列,如果它出现多次,你不会知道。

var l1 = [1,2,3,3,4,5,6],
    l2 = [3,4,5];

function subsequenceIndex(l1 /* haystack */, l2 /* needle */) {
    var startIndex = -1,
        failedMatch;

    for (var i = 0; i < l1.length; i++) {
        failedMatch = false;
        if (l1[i] === l2[0]) {

            for (var j = 1; j < l2.length; j++) {

                // check first that l1[i + j] is set
                if (l1[i + j] !== undefined && l2[j] !== l1[i + j]) {
                    failedMatch = true;
                    break;
                }
            }

            if (!failedMatch) {
                startIndex = i;
            }

        }
        if (startIndex !== -1) {
            return startIndex;
        }
     }

    return startIndex;
}

【讨论】:

  • 感谢您花时间发布解决方案,我尝试了其他方法,目前它工作得很好,但如果以后不能工作。我会选择你的算法;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2014-08-10
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
相关资源
最近更新 更多