在PHP開發中,陣列是非常重要的資料結構之一。而其中,求取數組的連續數是一個非常常見的需求。本文將介紹不同的方法來實現這一操作。
循環遍歷法是求取陣列連續數的常見方法。其基本想法是:假設數組中的第一個元素為起點,從這個起點開始依序向後遍歷元素,每次計算下一個元素和當前元素之間的差值是否為1。如果是,則代表數組中存在連續數。如果不是,則重新設定起點並繼續遍歷。
範例程式碼如下:
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。如果是,則代表數組中存在連續數。如果不是,則重新設定起點並繼續遍歷。
範例程式碼如下:
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。如果差值為1,則繼續遞歸下一個元素。如果差值不為1,則代表連續數結束,回傳上一層遞迴。
範例程式碼如下:
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]]
總結:
透過上述三種方法,我們可以輕鬆求取陣列的連續數。其中,循環遍歷法和排序法的時間複雜度為$O(nlogn)$,遞歸法的時間複雜度為$O(n)$。因此,在資料量較大的情況下,我們可以優先考慮使用遞歸法來實現。
以上是php 怎麼求數組的連續數的詳細內容。更多資訊請關注PHP中文網其他相關文章!