Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mencari nombor berturut-turut tatasusunan dalam php

Bagaimana untuk mencari nombor berturut-turut tatasusunan dalam php

PHPz
PHPzasal
2023-04-18 14:06:30504semak imbas

Dalam pembangunan PHP, tatasusunan ialah salah satu struktur data yang paling penting. Antaranya, mencari nombor berturut-turut tatasusunan adalah keperluan yang sangat biasa. Artikel ini akan menerangkan cara yang berbeza untuk melakukan ini.

  1. Kaedah lintasan gelung

Kaedah lintasan gelung ialah kaedah biasa untuk mencari nombor berturut-turut dalam tatasusunan. Idea asas ialah: dengan mengandaikan elemen pertama dalam tatasusunan ialah titik permulaan, melintasi elemen ke belakang dari titik permulaan ini, dan hitung sama ada perbezaan antara elemen seterusnya dan elemen semasa ialah 1 setiap kali. Jika ya, ini bermakna terdapat nombor berturut-turut dalam tatasusunan. Jika tidak, tetapkan semula titik permulaan dan teruskan melintasi.

Kod sampel adalah seperti berikut:

function findConsecutiveNumbers($arr){
    $res = [];
    $n = count($arr);
    for($i=0;$i<$n;$i++){
        $j=$i+1;
        $tmp=[];
        $tmp[] = $arr[$i];
        while($j<$n && $arr[$j]-$arr[$j-1]==1){
            $tmp[] = $arr[$j];
            $j++;
        }
        if(count($tmp)>1){
            $res[] = $tmp;
        }
    }
    return $res;
}

$arr = [1, 2, 3, 5, 6, 7, 9];
$res = findConsecutiveNumbers($arr);
print_r($res); //输出[[1,2,3],[5,6,7]]
  1. Kaedah isihan

Kaedah isihan ialah satu lagi kaedah biasa untuk mencari nombor berturut-turut dalam tatasusunan. Idea asasnya ialah: mula-mula susun tatasusunan asal, kemudian rentas elemen tatasusunan dalam urutan, dan kira sama ada perbezaan antara setiap elemen dan elemen sebelumnya ialah 1. Jika ya, ini bermakna terdapat nombor berturut-turut dalam tatasusunan. Jika tidak, tetapkan semula titik permulaan dan teruskan melintasi.

Kod sampel adalah seperti berikut:

function findConsecutiveNumbers($arr){
    sort($arr);
    $res = [];
    $n = count($arr);
    $tmp = [];
    for($i=0;$i<$n;$i++){
        if(!$i || $arr[$i]-$arr[$i-1]==1){
            $tmp[] = $arr[$i];
        }else{
            if(count($tmp)>1){
                $res[] = $tmp;
            }
            $tmp = [$arr[$i]];
        }
    }
    if(count($tmp)>1){
        $res[] = $tmp;
    }
    return $res;
}

$arr = [1, 2, 3, 5, 6, 7, 9];
$res = findConsecutiveNumbers($arr);
print_r($res); //输出[[1,2,3],[5,6,7]]
  1. Kaedah rekursif

Kaedah rekursif juga merupakan kaedah mencari nombor berturut-turut dalam tatasusunan, dengan merentasi setiap elemen secara rekursif, dan tentukan sama ada perbezaan antara setiap elemen dan elemen sebelumnya ialah 1. Jika perbezaannya ialah 1, teruskan mengulang ke elemen seterusnya. Jika perbezaannya bukan 1, ini bermakna nombor berterusan telah tamat dan tahap rekursi sebelumnya dikembalikan.

Kod sampel adalah seperti berikut:

function findConsecutiveNumbers($arr) {
    $res = array();
    $n = count($arr);
    $i = 1;
    $j = 0;
    while($i < $n) {
        if($arr[$i] - $arr[$i-1] == 1) {
            $i++;
        } else {
            $tmp = array_slice($arr, $j, $i-$j);
            if(count($tmp)>1){
                $res[] = $tmp;
            }
            $j = $i;
            $i++;
        }
    }
    $tmp = array_slice($arr, $j, $i-$j);
    if(count($tmp)>1){
        $res[] = $tmp;
    }
    return $res;
}

$arr = [1, 2, 3, 5, 6, 7, 9];
$res = findConsecutiveNumbers($arr);
print_r($res); //输出[[1,2,3],[5,6,7]]

Ringkasan:

Melalui tiga kaedah di atas, kita boleh mencari nombor berturut-turut tatasusunan dengan mudah. Antaranya, kerumitan masa kaedah lintasan gelung dan kaedah pengisihan ialah $O(nlogn)$, dan kerumitan masa kaedah rekursif ialah $O(n)$. Oleh itu, apabila jumlah data adalah besar, kita boleh memberi keutamaan untuk menggunakan kaedah rekursif.

Atas ialah kandungan terperinci Bagaimana untuk mencari nombor berturut-turut tatasusunan dalam php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn