Arrays 算法问题-在列表中查找一组项目
以下是我想做的: 我有两张清单 清单1:00F0001,00F0002,00F0003,00F0004,00F0005,00F0006,00F0007,00F0008,00F0009,00F0010 列表2:00F0006,00F0007,00F0008(此列表由第一个项目($首秀)和最后一个项目($fin)生成) 我想做的是: 如果“列表2”在“列表1”中,则返回true,仅此而已 因此,我尝试使用2,但我被阻止:/ 我的代码:Arrays 算法问题-在列表中查找一组项目,arrays,algorithm,loops,for-loop,while-loop,Arrays,Algorithm,Loops,For Loop,While Loop,以下是我想做的: 我有两张清单 清单1:00F0001,00F0002,00F0003,00F0004,00F0005,00F0006,00F0007,00F0008,00F0009,00F0010 列表2:00F0006,00F0007,00F0008(此列表由第一个项目($首秀)和最后一个项目($fin)生成) 我想做的是: 如果“列表2”在“列表1”中,则返回true,仅此而已 因此,我尝试使用2,但我被阻止:/ 我的代码: $id = substr($debut,0,4);
$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]){
.... ???? .....
}
}
}
$id=substr($0,4);
回显“id:”。$id;/*=00F0*/
$Start=substr($4,25);
$End=substr($fin,4,25);
$range=$End-$Start+1;
回声'范围:'.$Range;/*=我举了一个例子*/
对于($i=0;$i<$range;$i++){
$indicate2=$Start+$i;
$Num_Serie=str_pad($indicate2,4,'0',str_pad_LEFT);
$Num_Serie_决赛[$i]=$id.'.$Num_Serie;
}
$ArrayNS=$Num\u Serie\u Final;
$i_W=0;
而($produit=$reponse->fetch())和($check3==“false”)){
$ArrayProduit[$i_W]=$produit[1];
$i_W++;
}
对于($i2=0;$i2<$i_W;$i2++){
对于($i3=0;$i3<$range;$i3++){
如果($ArrayNS[$i2]==$ArrayProduit[$i3]){
.... ???? .....
}
}
}
第一个“for”是构建我的“List 2”。
“while”循环用于生成我的“列表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);
}
}
}
}
for($i3=0;$i3<$range;$i3++){
对于($i2=0;$i2<$i_W;$i2++){
如果($ArrayNS[$i3]==$ArrayProduit[$i2]){
对于($indice=0;$indice<$range;$indice++){
如果($ArrayNS[$indice]=$ArrayProduit[$i2+$indice]){
$ok=true;
回显“$ArrayNS[$indice]:”。$ArrayNS[$indice]。==$ArrayProduit[$i2+$indice]:”。$ArrayProduit[$i2+$indice]。”;
}
否则{
$ok=false;
$id_erreur=$ArrayNS[$indice];
echo“失败,原因是:”.$ArrayNS[$indice]。!==”.$ArrayProduit[$i2+$indice]。”;
}
}
如果($ok){
呼应“成功!!!”;
返回($ok);
}
否则{
回音“失败!!!”;
回报($id_erreur);
}
}
}
}
可能不是最好的方法,但它很有效^ ^我选择js作为控制台可测试性,但算法在php中是相同的 这个函数返回一个索引,但您只需检查您的索引是否与
-1
不同,就可以判断是否找到了它
我们的想法是循环遍历草堆的每个元素(l1
),如果当前元素与针的第一个元素匹配(l2
),那么我们开始从当前草堆索引(i
)循环到针索引的末尾(i+j
),但如果这些元素中的任何一个不匹配(在第一次出现时)我们跳到草堆的下一个值(l1
)并重试。如果没有失败(failedMatch
标志),则返回子序列的索引(l2
在l1
开始位置)
如果子序列没有出现在haystack中,我们按照约定返回-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;
}
var l1=[1,2,3,3,4,5,6],
l2=[3,4,5];
函数子序列索引(l1/*草堆*/,l2/*针*/){
var startIndex=-1,
不匹配;
对于(变量i=0;i
与其检查是否相等,不如检查是否不相等,如果不匹配,则中断内部循环。使用标志来确定是否中断或完成内部循环。在外部循环中,在内部循环之后,检查标志是否成功。为了节省时间并发布解决方案,我尝试了其他方法,目前它正在工作很好,但如果以后不行,我会用你的算法;)