PHP算法問題!附答案與思路解析

2.反轉函數的實現

/*** 反轉數組* @param array $arr* @return array*/function reverse($arr){ $n = count($arr); $left = 0; $right = $n - 1; while ($left < $right) { $temp = $arr[$left]; $arr[$left++] = $arr[$right]; $arr[$right--] = $temp; } return $arr;}

3.約瑟夫環問題

相關題目:一群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數, 再數到第m只,在把它踢出去…,如此不停的進行下去, 直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求編程模擬此過程,輸入m、n, 輸出最後那個大王的編號。

/*** 獲取大王* @param int $n* @param int $m* @return int */function get_king_mokey($n, $m) { $arr = range(1, $n); $i = 0; while (count($arr) > 1) { $i++; $survice = array_shift($arr); if ($i % $m != 0) { array_push($arr, $survice); } } return $arr[0];}

4.兩個有序int集合是否有相同元素的最優算法

/*** 尋找兩個有序數組裡相同的元素* @param array $arr1* @param array $arr2* @return array */function find_common($arr1, $arr2){ $common = array(); $i = $j = 0; $count1 = count($arr1); $count2 = count($arr2); while ($i < $count1 && $j < $count2) { if ($arr1[$i] < $arr2[$j]) { $i++; } elseif ($arr1[$i] > $arr2[$j]) { $j++; } else { $common[] = $arr[$i]; $i++; $j++; } } return array_unique($common);}

5.將一個數組中的元素隨機(打亂)

/*** 打亂數組* @param array $arr* @return array */function custom_shuffle($arr){ $n = count($arr); for ($i = 0; $i < $n; $i++) { $rand_pos = mt_rand(0, $n - 1); if ($rand_pos != $i) { $temp = $arr[$i]; $arr[$i] = $arr[$rand_pos]; $arr[$rand_pos] = $temp; } } return $arr;}

PHP算法問題!附答案與思路解析

6.給一個有數字和字母的字符串,讓連著的數字和字母對應

function number_alphabet($str){ $number = preg_split('/[a-z]+/', $str, -1, PREG_SPLIT_NO_EMPTY); $alphabet = preg_split('/d+/', $str, -1, PREG_SPLIT_NO_EMPTY); $n = count($number); for ($i = 0; $i < $count; $i++) { echo $number[$i] . ':' . $alphabet[$i] . '

'; }}$str = '1a3bb44a2ac';number_alphabet($str);//1:a 3:bb 44:a 2:ac

7.求n以內的質數(質數的定義:在大於1的自然數中,除了1和它本身意外,無法被其他自然數整除的數)

思路:

a.(質數篩選定理)n不能夠被不大於根號n的任何質數整除,則n是一個質數

b.除了2的偶數都不是質數

代碼如下:

/*** 求n內的質數* @param int $n* @return array*/function get_prime($n){ $prime = array(2);//2為質數 for ($i = 3; $i <= $n; $i += 2) {//偶數不是質數,步長可以加大 $sqrt = intval(sqrt($i));//求根號n for ($j = 3; $j <= $sqrt; $j += 2) {//i是奇數,當然不能被偶數整除,步長也可以加大。 if ($i % $j == 0) { break; } } if ($j > $sqrt) { array_push($prime, $i); } } return $prime;}print_r(getPrime(1000));

8.如何在有序的數組中找到一個數的位置(二分查找)

代碼如下:

/*** 二分查找* @param array $array 數組* @param int $n 數組數量* @param int $value 要尋找的值* @return int*/function binary_search($array, $n, $value){ $left = 0; $right = $n - 1; while ($left <= $right) { $mid = intval(($left + $right) / 2); if ($value > $array[$mid]) { $right = $mid + 1; } elseif ($value < $array[$mid]) { $left = $mid - 1; } else { return $mid; } } return -1;}

9.找出有序數組中隨機3個數和為0的所有情況

思路:動態規劃

function three_sum($arr){ $n = count($arr); $return = array(); for ($i=0; $i < $n; $i++) { $left = $i + 1; $right = $n - 1; while ($left <= $right) { $sum = $arr[$i] + $arr[$left] + $arr[$right]; if ($sum < 0) { $left++; } elseif ($sum > 0) { $right--; } else { $numbers = $arr[$i] . ',' . $arr[$left] . ',' . $arr[$right]; if (!in_array($numbers, $return)) { $return[] = $numbers; } $left++; $right--; } } } return $return;}$arr = [-10, -9, -8, -4, -2, 0, 1, 2, 3, 4, 5, 6, 9];var_dump(three_sum($arr));

10.編寫一個PHP函數,求任意n個正負整數里面最大的連續和,要求算法時間複雜度儘可能低。

思路:動態規劃

/*** 獲取最大的連續和* @param array $arr* @return int*/function max_sum_array($arr){ $currSum = 0; $maxSum = 0;//數組元素全為負的情況,返回最大數 $n = count($arr); for ($i = 0; $i < $n; $i++) { if ($currSum >= 0) { $currSum += $arr[$i]; } else { $currSum = $arr[$i]; } } if ($currSum > $maxSum) { $maxSum = $currSum; } return $maxSum;}

11.給定一個有序整數序列,找出絕對值最小的元素

思路:二分查找

/*** 獲取絕對值最小的元素* @param array $arr* @return int */function get_min_abs_value($arr){ //如果符號相同,直接返回 if (is_same_sign($arr[0], $arr[$n - 1])) { return $arr[0] >= 0 ? $arr[0] : $arr[$n - 1]; } //二分查找 $n = count($arr); $left = 0; $right = $n - 1; while ($left <= $right) { if ($left + 1 === $right) { return abs($arr[$left]) < abs($arr[$right]) ? $arr[$left] : $arr[$right]; } $mid = intval(($left + $right) / 2); if ($arr[$mid] < 0) { $left = $mid + 1; } else { $right = $mid - 1; } }}/*** 判斷符號是否相同* @param int $a* @param int $b* @return boolean */function is_same_sign($a, $b){ if ($a * $b > 0) { return true; } else { return false; }}


分享到:


相關文章: