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.
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]]
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]]
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!